@@ -230,7 +230,8 @@ modbus_read_cmd_sort_t *modbus_tag_sort(UT_array *tags, uint16_t max_byte)
230230 return sort_result ;
231231}
232232
233- int cal_n_byte (int type , neu_value_u * value , neu_datatag_addr_option_u option )
233+ int cal_n_byte (int type , neu_value_u * value , neu_datatag_addr_option_u option ,
234+ modbus_endianess_64 endianess_64 , bool default_tag_endian_64 )
234235{
235236 int n = 0 ;
236237 switch (type ) {
@@ -249,6 +250,9 @@ int cal_n_byte(int type, neu_value_u *value, neu_datatag_addr_option_u option)
249250 case NEU_TYPE_DOUBLE :
250251 case NEU_TYPE_INT64 :
251252 case NEU_TYPE_UINT64 :
253+ if (default_tag_endian_64 ) {
254+ modbus_convert_endianess_64 (value , endianess_64 );
255+ }
252256 n = sizeof (uint64_t );
253257 value -> u64 = neu_htonll (value -> u64 );
254258 break ;
@@ -282,7 +286,8 @@ int cal_n_byte(int type, neu_value_u *value, neu_datatag_addr_option_u option)
282286 return n ;
283287}
284288
285- modbus_write_cmd_sort_t * modbus_write_tags_sort (UT_array * tags )
289+ modbus_write_cmd_sort_t *
290+ modbus_write_tags_sort (UT_array * tags , modbus_endianess_64 endianess_64 )
286291{
287292 neu_tag_sort_result_t * result =
288293 neu_tag_sort (tags , tag_sort_write , tag_cmp_write );
@@ -304,14 +309,17 @@ modbus_write_cmd_sort_t *modbus_write_tags_sort(UT_array *tags)
304309 utarray_foreach (result -> sorts [i ].tags , modbus_point_write_t * * , tag_s )
305310 {
306311 if ((* tag_s )-> point .area == MODBUS_AREA_COIL ) {
307- n_byte_tag = cal_n_byte ((* tag_s )-> point .type , & (* tag_s )-> value ,
308- (* tag_s )-> point .option );
312+ n_byte_tag =
313+ cal_n_byte ((* tag_s )-> point .type , & (* tag_s )-> value ,
314+ (* tag_s )-> point .option , endianess_64 , true);
309315 data_bit [k / 8 ] += ((* tag_s )-> value .i8 ) << k % 8 ;
310316 n_byte += n_byte_tag ;
311317 k ++ ;
312318 } else {
313- n_byte_tag = cal_n_byte ((* tag_s )-> point .type , & (* tag_s )-> value ,
314- (* tag_s )-> point .option );
319+ n_byte_tag =
320+ cal_n_byte ((* tag_s )-> point .type , & (* tag_s )-> value ,
321+ (* tag_s )-> point .option , endianess_64 ,
322+ (* tag_s )-> point .option .value64 .is_default );
315323 memcpy (sort_result -> cmd [i ].bytes +
316324 2 *
317325 ((* tag_s )-> point .start_address -
@@ -521,4 +529,24 @@ static bool tag_sort_write(neu_tag_sort_t *sort, void *tag,
521529 }
522530
523531 return true;
532+ }
533+
534+ void modbus_convert_endianess_64 (neu_value_u * value ,
535+ modbus_endianess_64 endianess_64 )
536+ {
537+ switch (endianess_64 ) {
538+ case MODBUS_LL :
539+ break ;
540+ case MODBUS_BB :
541+ value -> u64 = neu_htonll (value -> u64 );
542+ break ;
543+ case MODBUS_LB :
544+ value -> u64 = neu_htonlb (value -> u64 );
545+ break ;
546+ case MODBUS_BL :
547+ value -> u64 = neu_htonbl (value -> u64 );
548+ break ;
549+ default :
550+ break ;
551+ }
524552}
0 commit comments