Connect WS2812B Light Strip to CodeSys via RasPi
CODESYS Forge
talk
(Thread)
Connect WS2812B Light Strip to CodeSys via RasPi
Last updated: 2024-10-16
Automation server - trends stop recording - need to manually reconnect
CODESYS Forge
talk
(Thread)
Automation server - trends stop recording - need to manually reconnect
Last updated: 2024-10-23
Problem to create 3 Alternative reset Switch
CODESYS Forge
talk
(Thread)
Problem to create 3 Alternative reset Switch
Last updated: 2024-10-29
How to use PLC_Open FBs with PROFINET servodrive (PROFIdrive layer)
CODESYS Forge
talk
(Thread)
How to use PLC_Open FBs with PROFINET servodrive (PROFIdrive layer)
Last updated: 2024-10-30
Converting each character to a string into ASCII
CODESYS Forge
talk
(Thread)
Converting each character to a string into ASCII
Last updated: 2024-11-08
Converting each character to a string into ASCII
CODESYS Forge
talk
(Thread)
Converting each character to a string into ASCII
Last updated: 2024-11-11
OPC UA C# client connecting to OPC UA CODESYS server
CODESYS Forge
talk
(Thread)
OPC UA C# client connecting to OPC UA CODESYS server
Last updated: 7 days ago
Unrecoverable SoftMotion state after switch to PreOp
CODESYS Forge
talk
(Thread)
Unrecoverable SoftMotion state after switch to PreOp
Last updated: 4 days ago
How to write multiple coils (Modbus FC15)
CODESYS Forge
talk
(Thread)
How to write multiple coils (Modbus FC15)
Last updated: 2 days ago
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 mondinmr on Direct Pointers in IOMapping for EtherCAT with IoDrvEthercatLib.ETCSlave_Dia
CODESYS Forge
talk
(Post)
Using SDO, I can read the EtherCAT mappings and offsets from various registers like 0x1c12, 0x1c13, etc. When I obtain registers mapped in the PDOs and various offsets, I could technically access directly to the statusword, controlword, etc., if they are mapped. I have noticed that on IoDrvEthercatLib.ETCSlave_Diag I can find pointers to the input and output buffers. However, although the input buffer can be easily read by referring to what has been obtained from the SDOs, it is not possible to write to the output buffer, as it is overwritten in each cycle by the data from the IOMapping task. Is there a way, knowing an instance of IoDrvEthercatLib.ETCSlave_Diag, to obtain the pointer to the first data in the IOMapping? The offsets are identical to those of the PDOs, but obviously the data is a copy. For me, the cleanest thing would be to access the pointers on IOMapping, for DS402a devices to retrieve the key data and point them to internal references. I need to know this as, having developed our own motion library, I would like to simplify the initial setup by eliminating unnecessary and nonsensical mappings that can lead users to unnecessary errors. In the current version that we have been using for years, we have to map everything manually. I would like to pass only the slave reference to the FB_init constructors and eliminate the mapping.
Last updated: 2024-02-12
Upgrading CODESYS runtime from v4.7 to v4.9 using a bash script leads to lose the licences stored in the soft container
CODESYS Forge
talk
(Thread)
Upgrading CODESYS runtime from v4.7 to v4.9 using a bash script leads to lose the licences stored in the soft container
Last updated: 2023-09-19
Post by nathant on Saving variable values on power cycle (RevPi Connect)
CODESYS Forge
talk
(Post)
Hello, this seems to be a known issue, but persistent/retain variables don't seem to work properly on RevPi devices. Is there a workaround to this? All I need is for a few configuration variables to be remembered through power cycle.
Last updated: 2023-12-03
Is there a way to Connect Visualization to a web that the buttons can be used using a mobile phone?
CODESYS Forge
talk
(Thread)
Is there a way to Connect Visualization to a web that the buttons can be used using a mobile phone?
Last updated: 2021-04-22
How to change list of referenced visualizations of a frame by programm? (NOT how to switch vis!)
CODESYS Forge
talk
(Thread)
How to change list of referenced visualizations of a frame by programm? (NOT how to switch vis!)
Last updated: 2023-06-01
Python Scripting: How to detect and handle "Object reference not set to an instance of an object" error
CODESYS Forge
talk
(Thread)
Python Scripting: How to detect and handle "Object reference not set to an instance of an object" error
Last updated: 2023-08-16
Is possible to transform a .sqlite file generated by a Trend Recording object to a .csv file?
CODESYS Forge
talk
(Thread)
Is possible to transform a .sqlite file generated by a Trend Recording object to a .csv file?
Last updated: 2017-12-22
Ethernet/IP Symbolic Access to I/O Channels pass the EIP Device FB instance to another FB IN_OUT
CODESYS Forge
talk
(Thread)
Ethernet/IP Symbolic Access to I/O Channels pass the EIP Device FB instance to another FB IN_OUT
Last updated: 2023-08-01
Post by meldawltly on Excel to Codesys 3.5
CODESYS Forge
talk
(Post)
Hello everyone, I have an excel file that i want to import into codesys3.5. Any idea how and what libraries can i use? To more clarify i have a table in codesys and i want to import my excel file into this table/ Thank you
Last updated: 2023-12-11
Post by meldawltly on Excel to Codesys 3.5
CODESYS Forge
talk
(Post)
Hello everyone, I have an excel file that i want to import into codesys3.5. Any idea how and what libraries can i use? To more clarify i have a table in codesys and i want to import my excel file into this table/ Thank you
Last updated: 2023-12-11
Post by ton on How to create a stopwatch?
CODESYS Forge
talk
(Post)
Hi, i guess you want to make a hour counter. You need to store the measured value. Try to use a retain variable, but need a graceful shutdown, or save it your self. see https://forge.codesys.com/forge/talk/Runtime/thread/278e325579/ Succes.
Last updated: 2023-12-12
Post by open on How to create a stopwatch?
CODESYS Forge
talk
(Post)
Thanks everyone for your input, I am using persistent variables to retain the timer value after machine shutdown, and main task to be as low as possible for the seconds TON to be accurate.
Last updated: 2023-12-14
Post by trycyclepower on How to transfer data from DINT to Union(16 Bools) which I need to use in Few FBs
CODESYS Forge
talk
(Post)
I have DINT data from drive input and would like to use this data in Bools in bunch of the FBs. I have tried using Union but it is not working. Please suggest
Last updated: 2023-12-14
Post by nadim4114 on Control Runtime Toolkit
CODESYS Forge
talk
(Post)
Hi @andreal, Were you able to adapt a codesys runtime to your linux based device? I am planning on the same lines. we want to develop a small controller of 64IOs for our application. We want to adapt codesys runtime on our Arm processor based embedded linux boards.
Last updated: 2023-12-26
Post by reinier-geers on One project diverent devices
CODESYS Forge
talk
(Post)
Ive got a project with 6 Divices version 9. They use networkvariable to communicate. I whant to add an Extra. But that one is probebly verion 19. Should that be a problem ? i have to update the software to 19. But i cant update the devices
Last updated: 2024-01-12
To search for an exact phrase, put it in quotes. Example: "getting started docs"
To exclude a word or phrase, put a dash in front of it. Example: docs -help
To search on specific fields, use these field names instead of a general text search. You can group with AND
or OR
.