Jump to content

Recommended Posts

Posted

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.

Posted (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 by Saxony Thermal
Posted

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.

Posted

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,

 

Posted

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

 

 

  • Like 1
Posted

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...

Posted (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 by Saxony Thermal

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...