Search talk: case OF

 
<< < 1 .. 26 27 28 29 30 .. 120 > >> (Page 28 of 120)

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 alessandro on SysMemCmp SysMemCpy CODESYS Forge talk (Post)
VAR Data1:ARRAY[1..10] OF SINT ; Data2:ARRAY[1..10] OF SINT ; Data3:ARRAY[1..10] OF SINT ; Data4:ARRAY[1..10] OF SINT ; ex_1 : BOOL ; ex_2 : BOOL ; enable : BOOL :=0 ; END_VAR // PROGRAM // The scope of this example is compare and copy the values of two ARRAY only if some value is different using SysMemCmp and SysMemCpy. // In this 2 example we don't use a FOR cicle for do this, and pBuffer1 and pBuffer2 is just a pointer to ARRAY. See details in Library util.SysMem of Codesys // The compare funcion util.SysMem.SysMemCmp is bidirectional if Data1 chanege respect Data2 ex_1 go to 1 and if Data2 change respect Data1 also // but the copy function util.SysMem.SysMemCpy work only from source ARRAY pSrc:=ADR(Data1) to destination ARRAY pDest:=ADR(Data2) // Example 1 Full ARRAY compare and copy // This compare 2 different equal ARRAY and if there is some difference ex_1 go to 1 and if you give enable he copy Data1 in Data2 ex_1 := TO_BOOL(util.SysMem.SysMemCmp(pBuffer1:=ADR(Data1), pBuffer2:=ADR(Data2), udiCount:=SIZEOF(Data1))); IF ex_1 AND enable THEN util.SysMem.SysMemCpy(pDest:=ADR(Data2), pSrc:=ADR(Data1), udiCount:=SIZEOF(Data1)); END_IF // Example 2 Only selected area of the ARRAY compare and copy // This compare 2 different equal ARRAY starting from position number [3] for 4 byte in this case start at position [3] and finish at position number [6] // and if there is some difference only in area [3..6] of the ARRAY ex_2 go to 1 if you give enalbe he copy Data3[3..6] in Data4[3..6] // if something change in other array position[0..2] or [7..10] are ingnored ex_2 := TO_BOOL(util.SysMem.SysMemCmp(pBuffer1:=ADR(Data3[3]), pBuffer2:=ADR(Data4[3]), udiCount:=4)); IF ex_2 AND enable THEN util.SysMem.SysMemCpy(pDest:=ADR(Data4[3]), pSrc:=ADR(Data3[3]), udiCount:=4); END_IF // Attention udiCount input is intended in <byte> in the example 1 I pass to udiCount:=SIZEOF(Data1) for compare and copy the intere ARRAY and // SIZEOF pass the size of intere ARRAY in byte to the function input, in this 2 examples I used variable type SINT each one occupie 1 byte and one position in the ARRAY // and in the example 2 I pass udiCount:=4 for compare and copy only 4 position of Data3/4[3..6] if you want to extend this example and use it for an ARRAY OF WORD // remember that each WORD will occupe 2 byte (16 bit) and you will have to pass udiCount:=SIZEOF(Data1) if you need to compare intere ARRAY example 1 // but need udiCount:=(42) for the example 2 because need to compare and copy 4 word each occupie 2 byte (16 bit). // For REAL (32 bit) need udiCount:=SIZEOF(44) for LREAL or (64 bit) need udiCount:=SIZEOF(416) // a good rule is calculate the dimension of the ARRAY in byte without empty space at the end, multiple of data type number for variable bigger then 8 bit // Example : If you want to create an ARRAY for 5 REAL (32 bit) each occupie 4 byte the correct size is ARRAY[0..19] OF REAL 54=20 position. // NOTE : In the example the position of compare function util.SysMem.SysMemCmp is first and the copy function util.SysMem.SysMemCpy inside the IF is after // in one cycle of the program the two array is compared and if there is some difference and enable are copied. // If you move util.SysMem.SysMemCmp after the IF cycle he will copare the ARRAY in the current cycle but the copy of the value will do in the next cycle.</byte>
Last updated: 2025-10-24

Post by gurke258 on Codesys Safety EtherCAT with Beckhoff CODESYS Forge talk (Post)
Okay, the solution was so simple... In my case, you first have to add the EL1918 and then the EL2904... then the connection is made automatically. I probably had something else before and then added the EL1918... then it doesn't catch the connection :/
Last updated: 2023-11-08

Post by installwhat on exception in system events handler CODESYS Forge talk (Post)
I've noticed that exceptions in system event handlers don't stop the runtime or call the exception handler. I've included a very basic example to demonstrate. It seems likely this is undesired but unavoidable. Is that the case? Is there any advice on the matter? Thanks
Last updated: 2024-07-08

Post by squale on URL jumps between different visualizations behind a reverse proxy CODESYS Forge talk (Post)
Hi kevinrn, I have the same question as yours. On my side I try to make nginx work but it doesn't goes well. I think the sub_filter doesn't work int this case.
Last updated: 2024-07-26

Post by lyngaansns on Python script: Launch Codesys, Execute Script, Exit Codesys CODESYS Forge talk (Post)
Hello I am looking for the same thing, so i don't have an answer, but in your case you could possibly use the --noUI flag when running codesys, if you don't care about showing what's happening.
Last updated: 2024-09-06

Post by pistola on Case Function - Multiple Conditions, Is it possible? CODESYS Forge talk (Post)
Thanks for the information, I ended up just making a long if else statement as each variable had 3 possible options, I figured at least this way it would still work.
Last updated: 2024-11-05

Post by aikapan on Ethernet/IP Scanner Exception CODESYS Forge talk (Post)
Same here. plcload in my case is about 7% while running. Watchdog ENIPScannerIOTask was about 200ms. Max cycle around 6ms, normal cycle time 4ms. Probably just increase the watchdog to 2000ms? or so... (Hardware: A Panel from Weintek)
Last updated: 2024-11-28

Post by eschwellinger on Newly created texlists wont appear in the selection dropdown CODESYS Forge talk (Post)
Guess you need to update Visualization Support Package to latest version (4.5.0.0) in case you are using CODESYS Visualization 4.7.0.0
Last updated: 2024-12-18

Post by milan-svarny on Redundancy problem - primary PLC suddenly goes to simulation state CODESYS Forge talk (Post)
Hi Ivanmaltar, please , did you solve the problem? i have the same case. Second PLC is going suddenly to Sim. state Thank you
Last updated: 2025-06-18

Post by arwie on Use MC_Home without enabling the drive for homing method 35 CODESYS Forge talk (Post)
So we pay 380€ for SoftMotion licenses for each robot, but have to implement such an obvious use case manually without any hint in the official documentation how to achieve this. This is crazy...
Last updated: 2025-07-31

Post by jonasz on TargetVisu not accepting touch inputs CODESYS Forge talk (Post)
So, in my case, the solution is to uncheck the option to support client animation and overlay native elements. Visualisation Manager -> Settings -> General Settings
Last updated: 2025-08-19

Post by eschwellinger on CODESYS control on RPi starts, shortly runs, then exits CODESYS Forge talk (Post)
in case you are using latest hw revision, there have been added some mac adresses - for the 4.17.0.0 release this might solve it. If not we need to investigate deeper. If it is application related you need to check the plclogger.
Last updated: 2025-09-02

Post by snhatton on Trace commands via Test Manager CODESYS Forge talk (Post)
One option could be to use a trigger variable to execute your trace and then toggle that variable from a step within a test case.
Last updated: 2023-12-08

Post by lostcontrol on Bool turning on in case stament in wrong state? CODESYS Forge talk (Post)
are you sure it is not used anywhere else.? does it have an address that could be duplicated perhaps? nothing external writing to it?
Last updated: 2023-12-16

Post by eschwellinger on Codesys Control Raspberry PI 4.10.0 - missing 'Update Raspberry PI' option CODESYS Forge talk (Post)
check if the RaspberryPI Package is installed (CODESYS Installer) If this is the case dd the menu command by 'tools->customize'again
Last updated: 2024-01-09

Post by nano on Library for arrays CODESYS Forge talk (Post)
habe a look at __new and __delete operators. have in mind that in this case u have a look at memory see https://help.codesys.com/api-content/2/codesys/3.5.15.0/en/_cds_operator_new/
Last updated: 2024-01-14

Post by paro on Multiple WebVisu CODESYS Forge talk (Post)
Hi, they should be independent when "Use CurrentVisu variable" is unchecked in the visu manager.. maybe you can give us more infos when its not the case.
Last updated: 2024-01-30

Post by ruben on DataSource not working CODESYS Forge talk (Post)
I had the same error. It took me a LONG way to figure it out, but in my case the problem was that I used LDATE_AND_TIME. It seems to be not supported, at least not in the Codesys version I used (3.5.16)
Last updated: 2024-02-01

Post by macros8 on Visualization using methods and cyclic ST-calls CODESYS Forge talk (Post)
Have you found the way how to call any function in case the visu is opened? Like on event when the screen is opened to initialize some variables etc.? I canΒ΄t... :/
Last updated: 2024-03-01

Post by ph0010421 on Sending Sequential Modbus TCP Packets CODESYS Forge talk (Post)
Hello You'll need to write a proper sequence to send, then wait for confirmation, and then move on to the next step. Use the CASE statement in ST. It's perfect for creating a sequence.
Last updated: 2024-03-08

Post by dagsupport on CAA SerialCOM - hCom Reset max value 1023 CODESYS Forge talk (Post)
Hi TimH Thanks for the information, I thought that was the case so have stepped through the code and found an error that wasn't closing the port, therefore hCom was increasing. Thanks
Last updated: 2024-03-28

Post by dagsupport on CAA SerialCOM - hCom Reset max value 1023 CODESYS Forge talk (Post)
Hi TimH Thanks for the information, I thought that was the case so have stepped through the code and found an error that wasn't closing the port, therefore hCom was increasing. Thanks
Last updated: 2024-03-28

Post by dagsupport on CAA SerialCOM - hCom Reset max value 1023 CODESYS Forge talk (Post)
Hi TimH Thanks for the information, I thought that was the case so have stepped through the code and found an error that wasn't closing the port, therefore hCom was increasing. Thanks
Last updated: 2024-03-28

Post by dagsupport on CAA SerialCOM - hCom Reset max value 1023 CODESYS Forge talk (Post)
Hi TimH Thanks for the information, I thought that was the case so have stepped through the code and found an error that wasn't closing the port, therefore hCom was increasing. Thanks
Last updated: 2024-03-28

<< < 1 .. 26 27 28 29 30 .. 120 > >> (Page 28 of 120)

Showing results of 2998

Sort by relevance or date