How to write multipule data ( byte) mesambccc

More
30 Jun 2025 20:26 #331046 by Bertho
A fix for the indicated problem has been committed to the master branch. It also includes several other fixes to provide better support for this and other devices by introducing byte types and some extra attributes.

The following mbccs file I suggest to use as a starting point. It only works with the new patches because it uses the new byte-types. Also, many types have been corrected to use the proper signed types and sizes. The interval is set to let the commands loot at 10Hz. There is probably no point in hammering the device with queries continuously.
Extra configuration may be necessary because some pins need to have a very specific values when you write (according to the docs; these are record written in a transaction). It will require starting the driver in suspended mode and use a hal-file to do pin setups before taking the driver out of suspend.

There are many issues that need to be addressed in this configuration. See also the comments in the below code. I do not know what exactly you are trying to do, but some reads are static data and some writes are probably one-time setup values that never will change during operation (and should therefore be initlist entries). Static data is not normally what you continuously want to read or write in a loop.

It is probably a good thing to try to define exactly what you are trying to achieve and control in the modbus communication. What running data is extracted/used elsewhere and what running parameters are to be live tuned. Remember, read function will read continuously and write functions will write every single change to a pin.
<?xml version="1.0" encoding="UTF-8"?>
<mesamodbus baudrate="115200" parity="E" stopbits="1" interval="100000">
  <!-- Note the interval setting: 100000 us (10 Hz) -->
  <!-- It may be necessary to start suspended (suspend="true") to setup pins before starting to send data -->
  <devices>
    <device address="0x02" name="mrje70a">
      <description>Manual for MR-JE-_A device communication:
  title: "MR-JE-_A SERVO AMPLIFIER INSTRUCTION MANUAL (Modbus RTU Protocol)"
  link:  https://dl.mitsubishielectric.com/dl/fa/document/manual/servo/sh030177/sh030177c.pdf
See chapter 6 for modbus types.
      </description>
    </device>
  </devices>

  <initlist>
    <!-- There should probably be some commands here... see comments below -->
  </initlist>

  <commands>
    <command device="mrje70a" function="R_REGISTERS" address="0x2b01" unaligned="1">
      <pin name="cfp" modbustype="S_CDAB" haltype="HAL_S32" />
    </command>
    <command device="mrje70a" function="R_REGISTERS" address="0x2b0f">
      <pin name="volt" modbustype="U_AB" haltype="HAL_U32" />
    </command>
    <command device="mrje70a" function="R_REGISTERS" address="0x2b2d">
      <pin name="power" modbustype="S_AB" haltype="HAL_S32" />
    </command>
    <command device="mrje70a" function="R_REGISTERS" address="0x2001" unaligned="1">
      <pin name="rpa01" modbustype="S_CDAB" haltype="HAL_S32" />
    </command>
    <!-- Not sure this should be read all the time -->
    <command device="mrje70a" function="R_REGISTERS" address="0x2801" modbustype="U_AB" haltype="HAL_U32">
      <pin name="rnument-2801" modbustype="U_A"/>
      <pin name="position" modbustype="S_CDAB" haltype="HAL_S32"/>
      <pin name="speed"/>
      <pin name="accel"/>
      <pin name="decel"/>
      <pin name="dwell"/>
      <pin name="subfunc" modbustype="U_A"/>
      <pin name="mcode" modbustype="U_A"/>
    </command>

    <!-- NOTE: The following command is only read *once* because EEPROM data is static data -->
    <command device="mrje70a" modbustype="U_CDAB" haltype="HAL_U32" function="R_REGISTERS" address="0x1010" interval="once" unaligned="1">
      <pin name="rnument-1010" modbustype="U_A"/>
      <pin name="eesave-all-parms"/>
      <pin name="eesave-comm-parms"/>
      <pin name="eesave-app-parms"/>
      <pin name="eesave-factory-parms"/>
      <pin name="eesave-point-table"/>
    </command>

    <command device="mrje70a" modbustype="U_CDAB" haltype="HAL_U32" function="R_REGISTERS" address="0x2c12" unaligned="1">
      <pin name="rnument-2c12" modbustype="U_A"/>
      <pin name="rextindsp-1"/>
      <pin name="rextindsp-2"/>
      <pin name="rextindsp-3"/>
      <pin name="rextindsp-4"/>
    </command>
    <command device="mrje70a" modbustype="U_AB" haltype="HAL_U32" function="R_REGISTERS" address="0x6041">
      <pin name="status"/>
    </command>
    <command device="mrje70a" modbustype="U_AB" haltype="HAL_U32" function="R_REGISTERS" address="0x6040">
      <pin name="rcontrolword"/>
    </command>
    <command device="mrje70a" modbustype="S_A" haltype="HAL_S32" function="R_REGISTERS" address="0x6061">
      <pin name="mode"/>
    </command>

    <!-- This is probably not something you want to read all the time. -->
    <!-- Does this change? it is written down below, see comment there. -->
    <command device="mrje70a" modbustype="S_AB" haltype="HAL_S32" function="R_REGISTERS" address="0x2d60">
      <pin name="rtargetpt"/>
    </command>

    <command device="mrje70a" modbustype="U_CDAB" haltype="HAL_U32" function="R_REGISTERS" address="0x6099">
      <pin name="rnument-6099" modbustype="U_A"/>
      <pin name="rhps-spd-switch"/>
      <pin name="rhps-spd-zero"/>
    </command>

    <!-- *** Write commands follow *** -->
 
    <!-- Setting the control word will need to be setup properly on the pin *before* the driver starts sending data. -->
    <!-- It also might be an initlist entry -->
    <command device="mrje70a" function="W_REGISTERS" modbustype="U_AB" haltype="HAL_U32" address="0x6040">
      <pin name="ctrlwordwt"/>
    </command>

    <!-- Setting the operational mode should most likely be done in the initlist -->
    <command device="mrje70a" function="W_REGISTERS" modbustype="S_A" haltype="HAL_S32" address="0x6060">
      <pin name="wopermode"/>
    </command>

    <!-- Setting the point table reference will need to be setup properly on the pin *before* the driver starts sending data. -->
    <!-- If it is to be in the command list, then writeflush polarity must be considered -->
    <!-- It might be required to be an initlist entry, as this is most likely a static config -->
    <command device="mrje70a" function="W_REGISTERS" modbustype="S_AB" haltype="HAL_S32" address="0x2d60">
      <pin name="wtargetpt"/>
    </command>
 
    <!-- Setting homing speed should probably be done in the initlist -->
    <!-- *** This write requires pin setup /before/ it is sent. *** The wnument-6099 should to be set to 0x02. -->
    <command device="mrje70a" function="W_REGISTERS" address="0x6099" modbustype="U_CDAB" haltype="HAL_U32">
      <pin name="wnument-6099" modbustype="U_A"/>
      <pin name="whps-spd-switch"/>
      <pin name="whps-spd-zero"/>
    </command>
  </commands>
</mesamodbus>

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

Time to create page: 0.090 seconds
Powered by Kunena Forum