Variables start_addr and count were read from query_packet using function mb_ntoh_safe. It looks like some compilers change the pointer alignment if the first byte starts at an odd address. Because mb_ntoh_safe uses pointers slave address and count (number of registers) were not read correctly from the buffer when several modbus slaves were present in network. In this temporary solution pointer aritmetics is replaced by simple 256 multiplication.
/*
* Copyright (c) 2002,2016 Mario de Sousa (msousa@fe.up.pt)
*
* This file is part of the Modbus library for Beremiz and matiec.
*
* This Modbus library is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
* General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this Modbus library. If not, see <http://www.gnu.org/licenses/>.
*
* This code is made available on the understanding that it will not be
* used in safety-critical situations without a full and competent review.
*/
#ifndef __MB_TYPES_H
#define __MB_TYPES_H
#ifndef __PLC_TYPES_H
/* if we have already included the MatPLC's type definitions, we don't need to delare the types ourselves... */
/* Tell the stdint.h file we want the limits of the data types defined. */
/* If being compiled by a C++ compiler, this is required! */
/* If being compiled by a C compiler, this is ignored! */
#define __STDC_LIMIT_MACROS
#include <stdint.h>
/* We use the _leastX_t versions of the data types as these are guaranteed
* to be the exact size we want.
* The int8_t, etc..., may have been defined to be the same as the
* _fastX_t version, which may take up more space than what is really wanted
* in order as to speed up memory access.
*/
typedef uint_least64_t u64; /* 64-bit unsigned integer */
typedef int_least64_t i64; /* 64-bit signed integer */
typedef uint_least32_t u32; /* 32-bit unsigned integer */
typedef int_least32_t i32; /* 32-bit signed integer */
typedef uint_least16_t u16; /* 16-bit unsigned integer */
typedef int_least16_t i16; /* 16-bit signed integer */
typedef uint_least8_t u8; /* 8-bit unsigned integer */
typedef int_least8_t i8; /* 8-bit signed integer */
#define u64_MAX UINT_LEAST64_MAX
#define u64_MIN UINT_LEAST64_MIN
#define i64_MAX INT_LEAST64_MAX
#define i64_MIN INT_LEAST64_MIN
#define u32_MAX UINT_LEAST32_MAX
#define u32_MIN UINT_LEAST32_MIN
#define i32_MAX INT_LEAST32_MAX
#define i32_MIN INT_LEAST32_MIN
#define u16_MAX UINT_LEAST16_MAX
#define u16_MIN UINT_LEAST16_MIN
#define i16_MAX INT_LEAST16_MAX
#define i16_MIN INT_LEAST16_MIN
#define u8_MAX UINT_LEAST8_MAX
#define u8_MIN UINT_LEAST8_MIN
#define i8_MAX INT_LEAST8_MAX
#define i8_MIN INT_LEAST8_MIN
#endif /* __PLC_TYPES_H */
#endif /* __MB_TYPES_H */