C51 COMPILER V9.53.0.0   MODBUS_DATA                                                       09/27/2025 15:47:46 PAGE 1   


C51 COMPILER V9.53.0.0, COMPILATION OF MODULE MODBUS_DATA
OBJECT MODULE PLACED IN ..\OBJ\modbus_data.obj
COMPILER INVOKED BY: C:\Keil_v5\C51\BIN\C51.EXE modbus_data.c LARGE OMF2 OPTIMIZE(3,SIZE) BROWSE INCDIR(..\USER;..\FUNC_
                    -HANDLER;..\GUI_APP) DEBUG PRINT(..\OBJ\modbus_data.lst) TABS(2) OBJECT(..\OBJ\modbus_data.obj)

line level    source

   1          /**
   2           * @file modbus_data.c
   3           * @brief Стандартная библиотека контроллера "Сатурн-PLC".
   4           * Функции преобразования типов для Modbus.
   5           * @version 0.1
   6           * @date 2024-04-02
   7           * 
   8           * @copyright Copyright (C) 2024, ООО "МНПП Сатурн"
   9           */
  10          #include "sys.h"
  11          #include "modbus.h"
  12          
  13          
  14          struct abcd {
  15                  uint8_t a;
  16                  uint8_t b;
  17                  uint8_t c;
  18                  uint8_t d;
  19              };
  20          
  21          union modbus_float_u {
  22              float f;
  23              struct abcd v;
  24              //
  25          
  26          };
  27          
  28          /**
  29           * @brief Преобразование значения 2-х последовательных регист
             -ров Modbus (4 байта) в значение float
  30           * без преобразования (ABCD)
  31           * @param src Указатель на первый регистр
  32           * @return float 
  33           */
  34          float ModbusGetFloatABCD(const uint16_t *src) {
  35   1          uint8_t *in = (uint8_t *) src;
  36   1          union modbus_float_u mf;
  37   1          //
  38   1          mf.v.a = in[0];
  39   1          mf.v.b = in[1];
  40   1          mf.v.c = in[2];
  41   1          mf.v.d = in[3];
  42   1          //
  43   1          return mf.f;
  44   1      }
  45          
  46          /**
  47           * @brief Преобразование значения 2-х последовательных регист
             -ров Modbus (4 байта) в значение float
  48           * в обратном порядке (DCBA)
  49           * @param src Указатель на первый регистр
  50           * @return float 
  51           */
  52          float ModbusGetFloatDCBA(const uint16_t *src) {
C51 COMPILER V9.53.0.0   MODBUS_DATA                                                       09/27/2025 15:47:46 PAGE 2   

  53   1          uint8_t *in = (uint8_t *) src;
  54   1          union modbus_float_u mf;
  55   1          //
  56   1          mf.v.d = in[0];
  57   1          mf.v.c = in[1];
  58   1          mf.v.b = in[2];
  59   1          mf.v.a = in[3];
  60   1          //
  61   1          return mf.f;
  62   1      }
  63          
  64          /**
  65           * @brief Преобразование значения 2-х последовательных регист
             -ров Modbus (4 байта) в значение float
  66           * с изменённым порядком байт в регистрах (BADC)
  67           * @param src 
  68           * @return float 
  69           */
  70          float ModbusGetFloatBADC(const uint16_t *src) {
  71   1          uint8_t *in = (uint8_t *) src;
  72   1          union modbus_float_u mf;
  73   1          //
  74   1          mf.v.b = in[0];
  75   1          mf.v.a = in[1];
  76   1          mf.v.d = in[2];
  77   1          mf.v.c = in[3];
  78   1          //
  79   1          return mf.f;
  80   1      }
  81          
  82          /**
  83           * @brief Преобразование значения 2-х последовательных регист
             -ров Modbus (4 байта) в значение float
  84           * с изменённым порядком регистров (CDAB)
  85           * @param src 
  86           * @return float 
  87           */
  88          float ModbusGetFloatCDAB(const uint16_t *src) {
  89   1          uint8_t *in = (uint8_t *) src;
  90   1          union modbus_float_u mf;
  91   1          //
  92   1          mf.v.c = in[0];
  93   1          mf.v.d = in[1];
  94   1          mf.v.a = in[2];
  95   1          mf.v.b = in[3];
  96   1          //
  97   1          return mf.f;
  98   1      }
  99          
 100          /**
 101           * @brief Преобразование значения float в два последовательных 
             -егистра Modbus (4 байта)
 102           * без изменения порядка (ABCD)
 103           * @param f 
 104           * @param dest 
 105           */
 106          void ModbusSetFloatABCD(float f, uint16_t *dest) {
 107   1          uint8_t *out = (uint8_t *) dest;
 108   1          union modbus_float_u mf;
 109   1          mf.f = f;
 110   1          //
 111   1          out[0] = mf.v.a;
C51 COMPILER V9.53.0.0   MODBUS_DATA                                                       09/27/2025 15:47:46 PAGE 3   

 112   1          out[1] = mf.v.b;
 113   1          out[2] = mf.v.c;
 114   1          out[3] = mf.v.d;
 115   1      }
 116          
 117          /**
 118           * @brief Преобразование значения float в два последовательных 
             -егистра Modbus (4 байта)
 119           * в обратном порядке (DCBA)
 120           * @param f 
 121           * @param dest 
 122           */
 123          void ModbusSetFloatDCBA(float f, uint16_t *dest) {
 124   1          uint8_t *out = (uint8_t *) dest;
 125   1          union modbus_float_u mf;
 126   1          mf.f = f;
 127   1          //
 128   1          out[0] = mf.v.d;
 129   1          out[1] = mf.v.c;
 130   1          out[2] = mf.v.b;
 131   1          out[3] = mf.v.a;
 132   1      }
 133          
 134          /**
 135           * @brief Преобразование значения float в два последовательных 
             -егистра Modbus (4 байта)
 136           * с изменённым порядком байт в регистрах (BADC)
 137           * @param f 
 138           * @param dest 
 139           */
 140          void ModbusSetFloatBADC(float f, uint16_t *dest) {
 141   1          uint8_t *out = (uint8_t *) dest;
 142   1          union modbus_float_u mf;
 143   1          mf.f = f;
 144   1          //
 145   1          out[0] = mf.v.b;
 146   1          out[1] = mf.v.a;
 147   1          out[2] = mf.v.d;
 148   1          out[3] = mf.v.c;
 149   1      }
 150          
 151          /**
 152           * @brief Преобразование значения float в два последовательных 
             -егистра Modbus (4 байта)
 153           * с изменённым порядком регистров (CDAB)
 154           * @param f 
 155           * @param dest 
 156           */
 157          void ModbusSetFloatCDAB(float f, uint16_t *dest) {
 158   1          uint8_t *out = (uint8_t *) dest;
 159   1          union modbus_float_u mf;
 160   1          mf.f = f;
 161   1          //
 162   1          out[0] = mf.v.c;
 163   1          out[1] = mf.v.d;
 164   1          out[2] = mf.v.a;
 165   1          out[3] = mf.v.b;
 166   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    765    ----
C51 COMPILER V9.53.0.0   MODBUS_DATA                                                       09/27/2025 15:47:46 PAGE 4   

   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----      96
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
   EDATA SIZE       =   ----    ----
   HDATA SIZE       =   ----    ----
   XDATA CONST SIZE =   ----    ----
   FAR CONST SIZE   =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)
