Posted 2 May Hello, After a lot of reading I was concluding I would have to do structured text. But then learning structured text I don't see how it solves my issue too. So I am lost: I have incoming messages of variable length. I know what the lengths are because there is a receive counter called SM8561 for the FX5CU CPU over its built-in RS485 port. I have to do a CRC check on it and then interpret the message afterwards to do things. For my CRC, I Omit the ending DLE-ETX. But the device location of DLE-ETX changes with message length. So I can't just say, (the below is not valid syntax, just an expression of what I want to do) if D4500 is start of message and the end of message is always DLE-ETX-CRC-CRC, where the last CRC byte is always device location D(4500+SM8561) //SM8561 is message length [MOV D(4500+ SM8561 - 0) D5000] and [MOV D(4500+ SM8561 - 1) D5000] to move the CRC bytes to another location like D5000 for me to process. I also have to move select bytes from my message to another location and in a continuous run of devices to help with CRC check. These device locations change with message length. I was looking at structured text but its the same issue, I can't assign a variable device number. So how do I process dynamic message lengths? This would be a cake-walk in C, I am just unfamiliar with PLC syntax to do this whether by iteration or logic array. Share this post Link to post Share on other sites
Posted 2 May You can access the elements of an array indirectly by using a device or label in the element number. This can be done the same way in FBD and ST. Share this post Link to post Share on other sites
Posted 2 May (edited) Hello, I appreciate your reply but I do not see how that relates to my challenge. I know I can make arrays and index them to do calculations, but I cant put that into MOV function for a device location for example. Where I need to move a device location that changes with time to a constant device location or a moving one. Like MOV D#a D#b, where MOV will put D#a into D#b where D#a is defined outside of the MOV function and can change, same with D#b. Like a download command message can have varying message length like D#a = D4500 to D#b = D4516, or a longer one like D#a = D4500 to D#b = D4586. Between the two cases, the device location that is holding my CRC bytes is always at the end of the message which are different per message length and I can't have a MOV command to access them for every possibility. I want to make an iterating search function that scans the message device by device, but there does not seem to be a way to process an iteration or loop that changes Device. Does that make sense? Edited 2 May by Saxony Thermal Share this post Link to post Share on other sites
Posted 2 May Change MyArray to be (0..499) and Assign it to D4500. Then your subscripts into MyArray can programmatically access any word from D4500 to D4999. Adjust to suit your needs. Share this post Link to post Share on other sites
Posted 2 May Hm, I still dont see how that can get into my ladder logic controls to increment my way through a range of devices. But I found the solution. The Z device. The below is working syntax for GXworks3: MOV D4500Z0 D5000Z0 Where, Z is an index register and with the syntax above, it means D(4500 + Z0), and Z0 can be a number you modify with timer loops like ADD K1 Z0. Here is where I found it. Read just the second reply from JRoss. Quote: " Pick a head address, say D100, and modify it with an index register, say Z0. Then you can call the indexed register like this: D100Z0. The index register acts as an offset, so if Z0 = 3, then you are actually pointing to D[100 + 3] or D103. " Thanks, Share this post Link to post Share on other sites
Posted 3 May The constant used in the example can also be an variable. Check the example of @pturmel ...... MyArray[Index] This doesnt have to be structued text it can be used in all editors 1 person likes this Share this post Link to post Share on other sites
Posted 14 May This D5000Z0 style indexing syntax has worked great but now I have another hurdle: If I wanted to index bit by bit, that syntax does not work anymore. For example I want to do the following: D5000Z0.Z1 (invalid syntax) or D5000.Z1 (invalid syntax) Notice the ( . ) which syntactically accesses that bit of the 16 bits. Below is all we can do: D5000.0 (valid syntax) Where .0 is the zeroth bit which can be .1 or other to index the specific bit of interest. But I can't put Z0 there for variable bit by bit access. I need this so I can increment my way up devices as well as each of the 16 bits of the device in a loop. Is there an appropriate syntax to do this? I also find it difficult to find where mitsubishi discusses this gxworks 3 specific syntax. I found it for ST but that doesnt help me in ladder specific syntax... Share this post Link to post Share on other sites
Posted 14 May (edited) I guess I can do this but it's not as explicit as I would like and I think causes me to loop more scan cycles? I will implement this and see. Take D5000.0 as a relay. Then bit shift (SFTL). With each shift the D5000.0 is checked for 1 or 0. In PLC's the bitshift doesn't flow into the neighboring device (unfortunately I would like that to happen for technical reasons, if someone knows how to do that...) so after 8 bit shifts then the device is unchanged and each bit was checked. Then increment to the next device D5000Z0 where we add 1 to Z0 to summon D5001 = D5000Z0. If I wish to inspect 256 devices in a row, then I have to setup device swapings with indexed device numbers like SWAP D5000Z0 D5000Z1 or something logical I have to figure out right now in order to feed all those bytes down to D5000.0 for bit by bit inspection of a 256 device string. I do know that BSFR bit shifts and replaces the vacancy with zeros instead of lopping the byte back around. That is nice. But I don't know how to just push it into the neighboring device. Edited 14 May by Saxony Thermal Share this post Link to post Share on other sites
Posted 15 May (edited) the solution is to use the bit proicessing instructions Like TEST - BSET etc Edited 15 May by Gambit Share this post Link to post Share on other sites
Posted 15 May I like those functions. I will give those a whirl and let you know how it goes. Thanks! Share this post Link to post Share on other sites
Posted 29 May Those functions worked nicely by the way, thank you! Share this post Link to post Share on other sites