@stepan-ozana Hi Stepan,
Thanks for sharing your experiences. Please, can you provide kanal2_od_000645.csv file? It is to be loaded in compile time in block CNA_uU.
Thanks.
Tomas
@stepan-ozana Hi Stepan,
Thanks for sharing your experiences. Please, can you provide kanal2_od_000645.csv file? It is to be loaded in compile time in block CNA_uU.
Thanks.
Tomas
@stepan-ozana Hi Stepan,
Thank you for your advanced question.
The proposed solution can look like the following:
RexCore -z simulation.enabled=1Simulation-related parameters (other parameters can be found at /rex/rexcore/rexcore.cfg.help):
simulation.enabled=1 // turns on simulation mode
simulation.tickmin=0 // minimum tick time in milliseconds (if calculations finish earlier, sleep is done; default 0, so no sleep is done)
simulation.steps // number of ticks after start, then the run stops
simulation.start // date and time before the start of the simulation; default 0, i.e. Rex epoch 1.1.2000 00:00:00
SILO/SILOS function block or STATELOAD/STATESAVE function block.If you have any additional questions, just let me know.
Regards,
Tomas
@MikeyH Hi Mike,
Thanks for the details. Currently, there is no direct support for such data representation.
For small-scale, I can imagine using the CNDR function block. You can also check the STEAM function block, but it appears the data you require is missing there.
There is also the possibility to use, e.g., Python or a C library if available.
Let me know your thoughts on this.
Regards,
Tomas
Hi @MikeyH ,
The error "Configuration requires higher license than available on the target device" is caused by having an old license version with the new REXYGEN.
This error does not prevent the algorithm from running – your System Log confirms it started successfully.
The real issue is the Modbus communication failure with your slave device. Could anything have changed on the slave device side recently?
Cheers,
Jan
@MikeyH Hi Mike,
Thanks for your post. Please can you add more details about your intention? Are you looking for a solution to store or use such a dataset in your control algorithm? Or is the goal to visualise similar diagrams on the HMI screen?
Kind regards,
Tomas
Hi everyone,
@AlexanderH solved his MCP3424 multi-channel reading issue! Here's the key takeaway:
When reading multiple channels sequentially from MCP3424, conversion time must be respected. Each configuration byte starts a new conversion:
Table 4.3 from MCP3424 datasheet lists all data rates by resolution.
One-shot mode + proper timing between configure/read operations:
For 12-bit (2 channels):
// Channel 1 - configure + convert + read
i2c_bufTx[0] = 0x80; // CH1, one-shot, 12-bit, gain x1
i2c_write_count = 1;
i2c_read_count = 0;
i2c_ret_fun = I2C(i2c_bus_handle, i2c_chip_address, i2c_bufTx, i2c_write_count, i2c_bufRx, i2c_read_count);
Sleep(0.01); // wait for 10 ms before reading the first channel
// Data rate: 12bit = 240 SPS, 14bit = 60 SPS, 16bit = 15 SPS, 18bit = 3.75 SPS
i2c_write_count = 0;
i2c_read_count = 3;
i2c_ret_fun = I2C(i2c_bus_handle, i2c_chip_address, i2c_bufTx, i2c_write_count, i2c_bufRx, i2c_read_count);
// i2c_bufRx[2] contains configuration byte
channel1 = ((i2c_bufRx[0]<<8) + i2c_bufRx[1])/2;
i2c_bufTx[0] = 0xA0; // channel 2, one-shot, 12bit, gain 1 (see MCP3424 datasheet)
i2c_write_count = 1;
i2c_read_count = 0;
i2c_ret_fun = I2C(i2c_bus_handle, i2c_chip_address, i2c_bufTx, i2c_write_count, i2c_bufRx, i2c_read_count);
Sleep(0.01); // wait for 10 ms before reading the second channel
// Data rate: 12bit = 240 SPS, 14bit = 60 SPS, 16bit = 15 SPS, 18bit = 3.75 SPS
i2c_write_count = 0;
i2c_read_count = 3;
i2c_ret_fun = I2C(i2c_bus_handle, i2c_chip_address, i2c_bufTx, i2c_write_count, i2c_bufRx, i2c_read_count);
channel2 = ((i2c_bufRx[0]<<8) + i2c_bufRx[1])/2;
Sleep time scales with resolution - 10ms works for 12-bit, 270ms needed for 18-bit
Original MCP3422 example worked because it read only 1 channel (no channel switching). The message from the previous tick was probably returned as a response.
REXYGEN example library will be extended with:
Big thanks to Alexander for the thorough debugging, testing different timing scenarios, and sharing his working scripts!
Cheers,
Jan
@martinpies Dear Martin,
Thank you for pointing this out. Everything should be working now. The command
sudo wget https://download.rexcontrols.com/rexygen.gpg -O /etc/apt/trusted.gpg.d/rexygen.gpg
will now download the new version of the certificate, which is supported even under the new licensing policy.
Cheers,
Jan
@martinpies
Hello Martin,
I apologize for the complications. This issue is on the REXYGEN side, and I have already reported it to the developers. I hope it will be resolved soon.
In the meantime, I recommend using our pre-installed Bookworm image according to the instructions in chapter 2.2 Monarco HAT: https://www.rexygen.com/doc/ENGLISH/MANUALS/RexCore_Installation/RexCore_Installation_ENG.html#x1-60002.2
Alternatively, you can install REXYGEN from Studio using the Quick bootstrapping guide in chapter 3.1: https://www.rexygen.com/doc/ENGLISH/MANUALS/RexCore_Installation/RexCore_Installation_ENG.html#x1-90003
Cheers,
Jan
@AlexanderH Hi Alexander,
we discussed the I2C communication details with the developers and both continuous reading and using multiple I2C commands within a single task cycle should be possible in your use case.
Unfortunately, there is no MCP342x device available on my side right now, but I will try to get one so the behavior can be reproduced and tested. In the meantime, could you please send a minimal version of your project, either here on the forum or to support@rexygen.com? That will make it much easier to see what is going on in your specific setup and suggest a concrete solution.
Cheers,
Jan
@AlexanderH Hi Alexander,
Great to see you experimenting with REXYGEN and getting good results so far! It’s nice that you started from the example library — that’s definitely the right approach. The I2C function in REXYGEN works a bit differently compared to Arduino or other low-level implementations. Since REXYGEN tasks usually don’t run with very short cycle times, a single I2C call performs both write and read operations within one cycle. This command takes care of sending the message, waiting briefly, and then reading the response. That means you don’t need to manually handle the NAK or stop condition — the function itself takes care of it.
I looked through your code and have a few notes that might help:
channel1, you have a return 0;. Because of that, the code for channel2 never runs — I guess that’s just for debugging, but it’s worth pointing out.main() you can just read the data by setting i2c_write_count = 0. That way, the I2C function won’t send any configuration bytes, it will only read — according to the documentation, that should work.Trace() function to print out the value of i2c_ret_fun for debugging. Keep in mind that you need to enable these messages in the system log:Hope this helps you move forward! Please let us know how it goes — it’s always interesting to see REXLANG + I2C projects in action.
Cheers,
Jan