Yes, that is correct.
------------------
发件人: "Mark Rivers" <rivers at cars.uchicago.edu>
发送时间: 2024-11-23 07:58:23
收件人: "shenzb at ihep.ac.cn" <shenzb at ihep.ac.cn>
抄送: "tech-talk at aps.anl.gov" <tech-talk at aps.anl.gov>
主题: RE: [SPAM] Re: autoConnect could not connect when reading a register by modbus relative addressing
- I change the modbusLength to 4 as what is done in motorAMCI. And I continuously read the values of 5 neighbor registers, like:
If you set the length to 4 then you can’t read 5 registers, you can only read 4. You need to increase the length to at least 5.
This is the first I heard that you are using a Modbus simulator, not the actual motor controller. Is this correct?
- The modbus slave simulator shows that the master and slave only communicated once. And the autoConnect issue is reported at the last time.
Looking back at your original message I understand why they only communicated once. You set the poll time in this command to 0, which means it does not poll.
- drvModbusAsynConfigure("DM2C_1_1_In_Word", "L0", 1, 3, 24576, 2, 0, 0, "DM2C_stepper")
You need to set a non-zero poll time. For example, this will poll every 100 ms.
- drvModbusAsynConfigure("DM2C_1_1_In_Word", "L0", 1, 3, 24576, 2, 0, 100, "DM2C_stepper")
Mark
Mark
From: shenzb at ihep.ac.cn <shenzb at ihep.ac.cn>
Sent: Friday, November 22, 2024 4:44 PM
To: Mark Rivers <rivers at cars.uchicago.edu>
Cc: tech-talk at aps.anl.gov
Subject: Re: [SPAM] Re: autoConnect could not connect when reading a register by modbus relative addressing
Dear Mark,
Thank you for your response. I can tell when will this issue happen with an example.
I change the modbusLength to 4 as what is done in motorAMCI. And I continuously read the values of 5 neighbor registers, like:
> status = pC_->readReg16(0, &read_val, DEFAULT_CONTROLLER_TIMEOUT);
> status = pC_->readReg16(1, &read_val, DEFAULT_CONTROLLER_TIMEOUT);
> status = pC_->readReg16(2, &read_val, DEFAULT_CONTROLLER_TIMEOUT);
> status = pC_->readReg16(3, &read_val, DEFAULT_CONTROLLER_TIMEOUT);
> status = pC_->readReg16(4, &read_val, DEFAULT_CONTROLLER_TIMEOUT);
The modbus slave simulator shows that the master and slave only communicated once. And the autoConnect issue is reported at the last time.
> readReg16: reg = 0, value= 2020
> readReg16: reg = 1, value= 2021
> readReg16: reg = 2, value= 2022
> readReg16: reg = 3, value= 2023
> 2024/11/23 06:24:07.881 DM2C_1_1_In_Word 4 autoConnect could not connect:
> readReg16: reg = 4, value= 2023
I mean this autoConnect error occurs when I want to send message for the second time.
Best regards,
Zhibang
------------------
发件人: "Mark Rivers" <rivers at cars.uchicago.edu>
发送时间: 2024-11-22 23:03:21
收件人: "tech-talk at aps.anl.gov"
<tech-talk at aps.anl.gov>,
沈治邦 <shenzb at ihep.ac.cn>
主题: [SPAM] Re: autoConnect could not connect
when reading a register by modbus relative addressing
I think I see the problem.
-
drvModbusAsynConfigure("DM2C_1_1_In_Word", "L0", 1, 3, 24576, 2, 0, 0, "DM2C_stepper")
That creates a driver that will use function code 3 to read from register location 24576 (0x6000). It will read 2 registers (the Modbus length argument), so it will read
registers 0x6000 and 0x6001.
・
status = pC_->readReg16(44, &read_val, DEFAULT_CONTROLLER_TIMEOUT);
However, here you are telling it to read relative register 44 (0x2c) which is absolute register 0x602c. That is invalid because you only configured the driver to read 2 registers.
You need to increase the number of registers in the drvModbusAsynConfigure to include all registers you will be accessing.
Mark
Hi,
I am encountering an issue while developing a modbus communication-based motor controller program, similar to the module motorAMCI.
I am attempting to read the values in registers with function code 3 by relative address. For instance, if I want to read the value located in 0x602C, which represents the current position
of the motor. I set the starting address to 0x6000 by the command in st.cmd
drvModbusAsynConfigure("DM2C_1_1_In_Word", "L0", 1, 3, 24576, 2, 0, 0, "DM2C_stepper")
Then to read the motor position, I called the function in driver.cpp with sentence
status = pC_->readReg16(44, &read_val, DEFAULT_CONTROLLER_TIMEOUT);
24657 is 0x6000 and 44 is 0x2C, then I believe that the value at 0x602c could be accessed.
The definition of the readReg16 is the same with the method ANG1Controller::readReg16()
Consequently, I am unable to retrieve the correct register value, and an error is showed:
2024/11/22 17:57:00.751 DM2C_1_1_In_Word 2 autoConnect could not connect:
Could someone please help me figure out what might be causing this issue?
Thank you!
Best regards,
Shen Zhibang