How to write multipule data ( byte) mesambccc

More
28 Jun 2025 16:58 #330963 by AdelRTP
this is my code for reading and writing using MESAMBCCC
I can read and write data without problem in case i use one register but when i try to write on a multiple registers i faced a lot of problems i captured some of them on the attachments
<?xml version="1.0" encoding="UTF-8"?>
<mesamodbus baudrate="115200" parity="E" stopbits="1">
  <devices>
      <device address="0x02" name="mrje70a"/>
  </devices>
  <initlist>
  </initlist>
  <commands>
    <command device="mrje70a" modbustype="U_AB" haltype="HAL_U32" function="R_REGISTERS" address="0x6099" count ="5" name="homingread"/>  
    <command device="mrje70a" function="W_REGISTERS" modbustype="U_AB" haltype="HAL_U32" address="0x6099" count="5" name="hommingwrite"/>
 
    <!--<command device="mrje70a" function="W_REGISTERS" address="0x6099" >
       <pin name= "hnumentries" modbustype="U_AB" haltype="HAL_U32"    value="02"/>
       <pin name= "hspeedss" modbustype="U_CDAB" haltype="HAL_U32"/>
       <pin name= "hspeedsz" modbustype="U_CDAB" haltype="HAL_U32"/>
    </command>-->   
</commands>    
</mesamodbus>
 
Attachments:

Please Log in or Create an account to join the conversation.

More
28 Jun 2025 17:14 #330964 by PCW
Can you attach your mesambccs file?
The following user(s) said Thank You: AdelRTP

Please Log in or Create an account to join the conversation.

More
28 Jun 2025 17:34 #330966 by AdelRTP
Replied by AdelRTP on topic How to write multipule data ( byte) mesambccc
<?xml version="1.0" encoding="UTF-8"?>
<mesamodbus baudrate="115200" parity="E" stopbits="1">
  <devices>
      <device address="0x02" name="mrje70a"/>
  </devices>
  <initlist>
  </initlist>
  <commands>
    <command device="mrje70a" modbustype="U_AB" haltype="HAL_U32" function="R_REGISTERS" address="0x6099" count ="5" name="homingread"/>  
    <command device="mrje70a" function="W_REGISTERS" modbustype="U_AB" haltype="HAL_U32" address="0x6099" count="5" name="hommingwrite"/>
 
    <!--<command device="mrje70a" function="W_REGISTERS" address="0x6099" >
       <pin name= "hnumentries" modbustype="U_AB" haltype="HAL_U32"    value="02"/>
       <pin name= "hspeedss" modbustype="U_CDAB" haltype="HAL_U32"/>
       <pin name= "hspeedsz" modbustype="U_CDAB" haltype="HAL_U32"/>
    </command>-->   
</commands>    
</mesamodbus>

Please Log in or Create an account to join the conversation.

More
28 Jun 2025 18:49 #330968 by AdelRTP
Replied by AdelRTP on topic How to write multipule data ( byte) mesambccc
This is my complete code
<?xml version="1.0" encoding="UTF-8"?>
<mesamodbus baudrate="115200" parity="E" stopbits="1">
<devices>
<device address="0x02" name="mrje70a"/>
</devices>

<initlist>

</initlist>

<commands>

<command device="mrje70a" modbustype="U_AB" haltype="HAL_U32" function="R_REGISTERS" address="0x2b01" count ="2" name="cfp"/>
<command device="mrje70a" modbustype="U_AB" haltype="HAL_U32" function="R_REGISTERS" address="0x2b0f" count ="1" name="volt"/>
<command device="mrje70a" modbustype="U_AB" haltype="HAL_U32" function="R_REGISTERS" address="0x2b2d" count ="1" name="power"/>
<command device="mrje70a" modbustype="U_AB" haltype="HAL_U32" function="R_REGISTERS" address="0x2001" count ="2" name="rpa01"/>
<command device="mrje70a" function="R_REGISTERS" address="0x2801">
<pin name = "numbreent" modbustype="U_AB" haltype="HAL_U32"/>
<pin name = "position" modbustype="U_CDAB" haltype="HAL_U32" scale ="0"/>
<pin name = "speed" modbustype="U_AB" haltype="HAL_U32"/>
<pin name = "acce" modbustype="U_AB" haltype="HAL_U32"/>
<pin name = "dec" modbustype="U_AB" haltype="HAL_U32"/>
<pin name="dwell" modbustype="U_AB" haltype="HAL_U32"/>
<pin name="subfunc" modbustype="U_AB" haltype="HAL_U32"/>
<pin name="mcode" modbustype="U_AB" haltype="HAL_U32"/>
</command>
<command device="mrje70a" modbustype="U_AB" haltype="HAL_U32" function="R_REGISTERS" address="0x1010" count ="11" name="eeprom"/>
<command device="mrje70a" modbustype="U_AB" haltype="HAL_U32" function="R_REGISTERS" address="0x2c12" count ="9" name="input"/>
<command device="mrje70a" modbustype="U_AB" haltype="HAL_U32" function="R_REGISTERS" address="0x6041" count ="1" name="status"/>
<command device="mrje70a" modbustype="U_AB" haltype="HAL_U32" function="R_REGISTERS" address="0x6040" count ="1" name="rcontrolword"/>
<command device="mrje70a" modbustype="S_AB" haltype="HAL_S32" function="R_REGISTERS" address="0x6061" count ="1" name="mode"/>
<command device="mrje70a" modbustype="U_AB" haltype="HAL_U32" function="R_REGISTERS" address="0x2d60" count ="1" name="rtargetpt"/>
<command device="mrje70a" modbustype="U_AB" haltype="HAL_U32" function="R_REGISTERS" address="0x6099" count ="5" name="homingspeed"/>

<command device="mrje70a" function="W_REGISTERS" modbustype="U_AB" haltype="HAL_U32" address="0x6040" count="1" name="ctrlwordwt" resend="1"/>
<command device="mrje70a" function="W_REGISTERS" modbustype="S_AB" haltype="HAL_S32" address="0x6060" count="1" name="wopermode" resend="1"/>
<command device="mrje70a" function="W_REGISTERS" modbustype="U_AB" haltype="HAL_U32" address="0x2d60" count="1" name="wtargetpt" resend="1"/>

<command device="mrje70a" function="W_REGISTERS" address="0x6099" >
<pin name= "hnumentries" modbustype="U_ABCD" haltype="HAL_U32" resend="1"/>

</command>

</commands>
</mesamodbus>


as you see when i m using W_REGISTERS white registers 2 bytes (U_AB) it s work but i dont know how to us it with registers have 4 bytes or more

Please Log in or Create an account to join the conversation.

More
28 Jun 2025 19:33 #330970 by PCW
This is different from your first example:

<command device="mrje70a" function="W_REGISTERS" address="0x6099" >
<pin name= "hnumentries" modbustype="U_ABCD" haltype="HAL_U32" resend="1"/>

Do you have the same error?

Have you tried setting hm2_modbus's debug value to get a more detailed error? 

Please Log in or Create an account to join the conversation.

More
28 Jun 2025 19:40 #330972 by AdelRTP
Replied by AdelRTP on topic How to write multipule data ( byte) mesambccc
Yes the second work perfect but when i want to add W_REGISTERS more then 2 byte i get hm2_modbus.0: error: Build data frame failed in write_flush for command 15, disabling

<command device="mrje70a" function="W_REGISTERS" address="0x2801">
<description>Write Point Table Data</description>
<pin name="wnumentries" modbustype="U_AB" haltype="HAL_U32"/>
<pin name="wposition" modbustype="U_CDAB" haltype="HAL_U32"/>
<pin name="wspeed" modbustype="U_AB" haltype="HAL_U32"/>
<pin name="wacceleration" modbustype="U_AB" haltype="HAL_U32"/>
<pin name="wdeceleration" modbustype="U_AB" haltype="HAL_U32"/>
<pin name="wdwell" modbustype="U_AB" haltype="HAL_U32"/>
<pin name="wsubfunction" modbustype="U_AB" haltype="HAL_U32"/>
<pin name="wmcode" modbustype="U_AB" haltype="HAL_U32"/>
</command>

Idont know how to use debug

Please Log in or Create an account to join the conversation.

More
28 Jun 2025 20:20 #330973 by PCW
debug is described in the hm2_modbus manual page.

Please Log in or Create an account to join the conversation.

More
28 Jun 2025 21:29 #330976 by Bertho
Hello, (author of the hm2_modbus driver calling...)

First, what is the error code generated? See the hm2_modbus.0.command.NN.error-code pins.

Second, what LCNC version are you using?

Just a comment on the attached documentation image:
Reading and writing registers are, in modbus terms, always multiples of word (2-byte) quantities. The image with the "Home position return speed" at register address 0x6099 states a /single byte/ and then two 4-byte words. The documentation is slightly misleading. It states in the next column that 5 registers are actually involved, so that would indicate that the first is masked to a byte sized value (masking is not supported or performed by the hm2_modbus driver). The 5-register statement in the table would also fix the problem of having 32-bit words seemingly on a odd address boundary. But with 5 registers, then the "number of entries" value is at address 0x6099 and the two 32-bit words are at 0x609a and 0x609c resp.. BTW, I notice the interesting mixed endianess of the 32-bit values...

The read operation seems to work as intended, but the write operation fails. The failure is apparently not a problem of the mbccs file. It is an error message of the hm2_modbus driver that indicates something odd is happening.

When compiling the mbccs file I get a couple of warnings (using first file below):
mrje70a.mbccs: warning: Multi-register type 'U_CDAB' not aligned to natural boundary in commands/command[1]/pin[2]
mrje70a.mbccs: warning: Multi-register type 'U_CDAB' not aligned to natural boundary in commands/command[1]/pin[3]
mrje70a.mbccs: warning: Multi-register type 'U_CDAB' not aligned to natural boundary in commands/command[2]/pin[2]
mrje70a.mbccs: warning: Multi-register type 'U_CDAB' not aligned to natural boundary in commands/command[2]/pin[3]

But, that should not be the case. This is an error in mesambccc not being able to count correctly. Using the --verbose option clearly shows the address to be even. I have to investigate and see what is happening. I am guessing that the hm2_modbus error is secondary to an error in mesambccc when setting the command and pin fields for the command lists. As a temporary fix: splitting the read and write commands into two separate commands makes the warnings go away (second source below). It /might/ fix the read/write issue you are having. The downside is that the read/write no longer is one single modbus transaction. That may or may not be a problem, depending the device.

The way you wrote the definition should work. I'd write it like:
[code][code][code]<?xml version="1.0" encoding="UTF-8"?>
[code]<mesamodbus baudrate="115200" parity="E" stopbits="1">
  <devices><device address="0x02" name="mrje70a"/></devices>
  <initlist />
  <commands>
    <command device="mrje70a" function="R_REGISTERS" address="0x6099" haltype="HAL_U32">
      <pin name="rnumentries" modbustype="U_AB"/>
      <pin name="rspeedss" modbustype="U_CDAB"/>
      <pin name="rspeedsz" modbustype="U_CDAB"/>
    </command>
    <command device="mrje70a" function="W_REGISTERS" address="0x6099" haltype="HAL_U32">
      <pin name="wnumentries" modbustype="U_AB"/>
      <pin name="wspeedss" modbustype="U_CDAB"/>
      <pin name="wspeedsz" modbustype="U_CDAB"/>
    </command>
  </commands>
</mesamodbus>

---

<?xml version="1.0" encoding="UTF-8"?>
<mesamodbus baudrate="115200" parity="E" stopbits="1">
  <devices><device address="0x02" name="mrje70a"/></devices>
  <initlist />
  <commands>
    <command device="mrje70a" function="R_REGISTERS" address="0x6099" haltype="HAL_U32">
      <pin name="rnumentries" modbustype="U_AB"/>
    </command>
    <command device="mrje70a" function="R_REGISTERS" address="0x609a" haltype="HAL_U32">
      <pin name="rspeedss" modbustype="U_CDAB"/>
      <pin name="rspeedsz" modbustype="U_CDAB"/>
    </command>
    <command device="mrje70a" function="W_REGISTERS" address="0x6099" haltype="HAL_U32">
      <pin name="wnumentries" modbustype="U_AB"/>
    </command>
    <command device="mrje70a" function="W_REGISTERS" address="0x609a" haltype="HAL_U32">
      <pin name="wspeedss" modbustype="U_CDAB"/>
      <pin name="wspeedsz" modbustype="U_CDAB"/>
    </command>
  </commands>
</mesamodbus>
[/code][/code][/code][/code]

Please Log in or Create an account to join the conversation.

More
28 Jun 2025 21:48 - 28 Jun 2025 21:49 #330977 by Bertho
Just one more thought...

Is it necessary that the write command has pins? Does this data change real-time?
There are several side-effects to this being pins that can change. For example, the documentation lets on that it needs to be written as *one* modbus transaction. (that would mean I first need to fix the bug)

These parameters look like initialization values you set once and leave the same. If that is the case, you can simply make it a single command writing the necessary registers in the <initlist> in one command writing the 5 registers with static data/values in one transaction.
Last edit: 28 Jun 2025 21:49 by Bertho.
The following user(s) said Thank You: COFHAL

Please Log in or Create an account to join the conversation.

More
29 Jun 2025 19:29 #331012 by Bertho
Hi again,

The bug has been found in the driver. It was indeed not counting correctly resulting in trying to overflow the buffer (that caused an abort without writing beyond the buffer). I will be making a patch for it tomorrow.

Also, the mrje70a device is something of a piece with very complex modbus communication (I downloaded the comms spec). It seems to use "record reads and writes in depth" where several values are read/write from an address in a structure like fashion. These must be read/written using a single modbus transaction (when the "continuous read/write" column set to "impossible" it seems to denote that it is a record read/written in depth and not by incremental address). That is the first time I've seen such a hack. Luckily, the driver can do that (but you need to ignore the misalignment warnings from mesambccc). However, some extra pin setup is needed before you want to start writing or you will be sending half or malformed data. I'll show how to do that when I have made the patch.

All that said, the patch will also include a fix for the completely brain-dead mrje70a communication, where it returns a single signed byte (!) in a word register's LSB and zeros the MSB while leaving the user the hassle to tackle the sign extension. The patch will allow you to perform the proper sign extension to s32, s64 or float hal types by introducing a byte type.
The following user(s) said Thank You: Aciera

Please Log in or Create an account to join the conversation.

Time to create page: 0.186 seconds
Powered by Kunena Forum