Browse Source

Работа с уставками и калибровкой

unknown 3 months ago
parent
commit
295a315436

+ 284 - 218
fw/modules/modbus/modbus_ai_params.c

@@ -1,219 +1,285 @@
-#include "at32f403a_407.h"
-#include "modbus_ai_params.h"
-#include "settings_api.h"
-#include "modbus_params.h"
-#include "analog_input.h"
-
-
-extern mb_param_t mb_param[];
-
-#if defined (MAI_12)
-
-//
-uint16_t mb_init_ai_params(uint16_t i)
-{
-    uint16_t index = i;
-    uint16_t addr = 0;  
-  
-    // Статус входов (вкл./выкл.)
-    mb_param[index].reg = 0x0300;
-	mb_param[index].size = 1;
-	mb_param[index].param = (uint8_t*)&settings.ai_state_bits;
-	mb_param[index].set = mb_set_ai_state;
-    mb_param[index].get = NULL;
-    mb_param[index].check_handler = mb_check_dummy;
-    
-    index++;
-
-    // Режим работы входов
-    mb_param[index].reg = 0x0301;
-	mb_param[index].size = 1;
-	mb_param[index].param = (uint8_t*)&settings.ai_mode_bits;
-	mb_param[index].set = mb_set_ai_mode;
-    mb_param[index].get = NULL;
-    mb_param[index].check_handler = mb_check_dummy;
-    
-    index++;
-
-    // Флаги аварий аналоговых входов. Определяется аппаратно.
-    mb_param[index].reg = 0x0302;
-	mb_param[index].size = 1;
-	mb_param[index].param = (uint8_t*)&ai_alarm;
-	mb_param[index].set = NULL;
-    mb_param[index].get = NULL;
-    mb_param[index].check_handler = mb_check_dummy;
-    
-    index++;
-    
-    // 
-    mb_param[index].reg = 0x0303;
-	mb_param[index].size = 1;
-	mb_param[index].param = (uint8_t*)&settings.ext_sens_power;
-	mb_param[index].set = mb_set_ext_sens_power;
-    mb_param[index].get = NULL;
-    mb_param[index].check_handler = mb_check_dummy;
-    
-    index++;
-    
-    // Коэффициенты усиления. Регистры 0x0310 - 0x031В.
-    addr = 0x0310;
-    for (int i = 0; i < AI_COMMON_NUMBER; i++)
-    {
-        mb_param[index].reg = addr;
-        mb_param[index].size = 1;
-        mb_param[index].param = (uint8_t*)&ai_gain[i];
-        mb_param[index].set = mb_set_ai_gain;
-        mb_param[index].get = NULL;
-        mb_param[index].check_handler = mb_check_dummy;
-        
-        addr += 1;
-        index++;
-    }
-    
-    // ---------------------------------------------------------------------- //
-    // Коэффициенты K
-    addr = 0x0320;
-    for (int i = 0; i < AI_COMMON_NUMBER; i++)
-    {
-        mb_param[index].reg = addr;
-        mb_param[index].size = 2;
-        mb_param[index].param = (uint8_t*)&settings.ai[i].k_factor;
-        mb_param[index].set = NULL;
-        mb_param[index].get = NULL;
-        mb_param[index].check_handler = mb_check_dummy;
-        
-        addr += 2;
-        index++;
-    }
-    
-    // ---------------------------------------------------------------------- //
-    // Коэффициенты B
-    addr = 0x0340;
-    for (int i = 0; i < AI_COMMON_NUMBER; i++)
-    {
-        mb_param[index].reg = addr;
-        mb_param[index].size = 2;
-        mb_param[index].param = (uint8_t*)&settings.ai[i].b_factor;
-        mb_param[index].set = NULL;
-        mb_param[index].get = NULL;
-        mb_param[index].check_handler = mb_check_dummy;
-        
-        addr += 2;
-        index++;
-    }
-        
-    // ---------------------------------------------------------------------- //
-    // Сырые данные каналов ADC
-    addr = 0x0360;
-    for (int i = 0; i < AI_COMMON_NUMBER; i++)
-    {
-        mb_param[index].reg = addr + i;
-        mb_param[index].size = 1;
-        mb_param[index].param = (uint8_t*)&adc_com_raw_data[i];
-        mb_param[index].set = NULL;
-        mb_param[index].get = NULL;
-        mb_param[index].check_handler = mb_check_dummy;
-        
-        index++;
-    }
-    
-    addr = 0x036C;
-    // V_ISO_CL, V_ISO, CRNT_LIM_U_BFR_R, CRNT_LIM_U_ABFR_R
-    for (int i = 0; i < AI_ADD_NUMBER; i++)
-    {
-        mb_param[index].reg = addr + i;
-        mb_param[index].size = 1;
-        mb_param[index].param = (uint8_t*)&adc_add_raw_data[i];
-        mb_param[index].set = NULL;
-        mb_param[index].get = NULL;
-        mb_param[index].check_handler = mb_check_dummy;
-        
-        index++;
-    }
-
-    // ---------------------------------------------------------------------- //
-    // Фильтрованные данные с учетом коэф-ов К, B
-    addr = 0x0380;
-    for (int i = 0; i < AI_COMMON_NUMBER; i++)
-    {
-        mb_param[index].reg = addr;
-        mb_param[index].size = 2;
-        mb_param[index].param = (uint8_t*)&adc_com_data[i];
-        mb_param[index].set = NULL;
-        mb_param[index].get = NULL;
-        mb_param[index].check_handler = mb_check_dummy;
-        
-        addr += 2;
-        index++;
-    }
-    
-    // ---------------------------------------------------------------------- //
-    // Фильтрованные значения 12-и основных каналов. Вывод для отладки.
-    addr = 0x03A0;
-    for (int i = 0; i < AI_COMMON_NUMBER; i++)
-    {
-        mb_param[index].reg = addr + i;
-        mb_param[index].size = 1;
-        mb_param[index].param = (uint8_t*)&adc_com_fil_data[i];
-        mb_param[index].set = NULL;
-        mb_param[index].get = NULL;
-        mb_param[index].check_handler = mb_check_dummy;
-        
-        index++;
-    }
-   
-    // ---------------------------------------------------------------------- //
-    
-    return index;
-}
-
-
-// -------------------------------------------------------------------------- //
-//                          Установка параметров
-// -------------------------------------------------------------------------- //
-
-//
-mb_delay_action_t mb_set_ai_state(void)
-{
-    ai_set();
-    return MB_NO_ACTION;
-}
-
-
-// При изменении режима измерения нужно проверить флаг аварий.
-// Если флаг установлен, то канал нельзя перевести в режим измерения тока.
-mb_delay_action_t mb_set_ai_mode(void)
-{
-    for (uint8_t i = 0; i < AI_COMMON_NUMBER; i++) 
-    {
-        if (!ai_alarm_f[i].alarm_flag)
-            settings.ai[i].mode = (uint8_t)((settings.ai_mode_bits >> i) & 1);
-        else if (((uint8_t)(settings.ai_mode_bits >> i) & 1) == 0)
-            settings.ai[i].mode = (uint8_t)((settings.ai_mode_bits >> i) & 1);
-    }  
-    ai_set_meas_mode();  
-    return MB_SAVE_SETTINGS;
-}
-
-
-//
-mb_delay_action_t mb_set_ai_gain(void)
-{
-    for (uint8_t i = 0; i < AI_COMMON_NUMBER; i++)
-    {
-        settings.ai[i].gain_factor = ai_gain[i];
-    }  
-    return MB_NO_ACTION;
-}
-
-//
-mb_delay_action_t mb_set_ext_sens_power(void)
-{
-    if (!ai_cur_lim.alarm_flag)
-        ai_ext_sens_power(settings.ext_sens_power);
-      
-    return MB_SAVE_SETTINGS;
-}
-
-
+#include "at32f403a_407.h"
+#include "modbus_ai_params.h"
+#include "settings_api.h"
+#include "modbus_params.h"
+#include "analog_input.h"
+#include "preset_ai.h"
+
+
+extern mb_param_t mb_param[];
+
+#if defined (MAI_12)
+
+//
+uint16_t mb_init_ai_params(uint16_t i)
+{
+    uint16_t index = i;
+    uint16_t addr = 0;  
+  
+    // Статус входов (вкл./выкл.)
+    mb_param[index].reg = 0x0300;
+	mb_param[index].size = 1;
+	mb_param[index].param = (uint8_t*)&settings.ai_state_bits;
+	mb_param[index].set = mb_set_ai_state;
+    mb_param[index].get = NULL;
+    mb_param[index].check_handler = mb_check_dummy;
+    
+    index++;
+
+    // Режим работы входов
+    mb_param[index].reg = 0x0301;
+	mb_param[index].size = 1;
+	mb_param[index].param = (uint8_t*)&settings.ai_mode_bits;
+	mb_param[index].set = mb_set_ai_mode;
+    mb_param[index].get = NULL;
+    mb_param[index].check_handler = mb_check_dummy;
+    
+    index++;
+
+    // Флаги аварий аналоговых входов. Определяется аппаратно.
+    mb_param[index].reg = 0x0302;
+	mb_param[index].size = 1;
+	mb_param[index].param = (uint8_t*)&ai_alarm;
+	mb_param[index].set = NULL;
+    mb_param[index].get = NULL;
+    mb_param[index].check_handler = mb_check_dummy;
+    
+    index++;
+    
+    // 
+    mb_param[index].reg = 0x0303;
+	mb_param[index].size = 1;
+	mb_param[index].param = (uint8_t*)&settings.ext_sens_power;
+	mb_param[index].set = mb_set_ext_sens_power;
+    mb_param[index].get = NULL;
+    mb_param[index].check_handler = mb_check_dummy;
+    
+    index++;
+    
+    // Коэффициенты усиления. Регистры 0x0310 - 0x031В.
+    addr = 0x0310;
+    for (int i = 0; i < AI_COMMON_NUMBER; i++)
+    {
+        mb_param[index].reg = addr;
+        mb_param[index].size = 1;
+        mb_param[index].param = (uint8_t*)&ai_gain[i];
+        mb_param[index].set = mb_set_ai_gain;
+        mb_param[index].get = NULL;
+        mb_param[index].check_handler = mb_check_dummy;
+        
+        addr += 1;
+        index++;
+    }
+    
+    // ---------------------------------------------------------------------- //
+    // Коэффициенты K
+    addr = 0x0320;
+    for (int i = 0; i < AI_COMMON_NUMBER; i++)
+    {
+        mb_param[index].reg = addr;
+        mb_param[index].size = 2;
+        mb_param[index].param = (uint8_t*)&settings.ai[i].k_factor;
+        mb_param[index].set = NULL;
+        mb_param[index].get = NULL;
+        mb_param[index].check_handler = mb_check_dummy;
+        
+        addr += 2;
+        index++;
+    }
+    
+    // ---------------------------------------------------------------------- //
+    // Коэффициенты B
+    addr = 0x0340;
+    for (int i = 0; i < AI_COMMON_NUMBER; i++)
+    {
+        mb_param[index].reg = addr;
+        mb_param[index].size = 2;
+        mb_param[index].param = (uint8_t*)&settings.ai[i].b_factor;
+        mb_param[index].set = NULL;
+        mb_param[index].get = NULL;
+        mb_param[index].check_handler = mb_check_dummy;
+        
+        addr += 2;
+        index++;
+    }
+        
+    // ---------------------------------------------------------------------- //
+    // Сырые данные каналов ADC
+    addr = 0x0360;
+    for (int i = 0; i < AI_COMMON_NUMBER; i++)
+    {
+        mb_param[index].reg = addr + i;
+        mb_param[index].size = 1;
+        mb_param[index].param = (uint8_t*)&adc_com_raw_data[i];
+        mb_param[index].set = NULL;
+        mb_param[index].get = NULL;
+        mb_param[index].check_handler = mb_check_dummy;
+        
+        index++;
+    }
+    
+    addr = 0x036C;
+    // V_ISO_CL, V_ISO, CRNT_LIM_U_BFR_R, CRNT_LIM_U_ABFR_R
+    for (int i = 0; i < AI_ADD_NUMBER; i++)
+    {
+        mb_param[index].reg = addr + i;
+        mb_param[index].size = 1;
+        mb_param[index].param = (uint8_t*)&adc_add_raw_data[i];
+        mb_param[index].set = NULL;
+        mb_param[index].get = NULL;
+        mb_param[index].check_handler = mb_check_dummy;
+        
+        index++;
+    }
+
+    // ---------------------------------------------------------------------- //
+    // Фильтрованные данные с учетом коэф-ов К, B
+    addr = 0x0380;
+    for (int i = 0; i < AI_COMMON_NUMBER; i++)
+    {
+        mb_param[index].reg = addr;
+        mb_param[index].size = 2;
+        mb_param[index].param = (uint8_t*)&adc_com_data[i];
+        mb_param[index].set = NULL;
+        mb_param[index].get = NULL;
+        mb_param[index].check_handler = mb_check_dummy;
+        
+        addr += 2;
+        index++;
+    }
+    
+    // ---------------------------------------------------------------------- //
+    // Фильтрованные значения 12-и основных каналов. Вывод для отладки.
+    addr = 0x03A0;
+    for (int i = 0; i < AI_COMMON_NUMBER; i++)
+    {
+        mb_param[index].reg = addr + i;
+        mb_param[index].size = 1;
+        mb_param[index].param = (uint8_t*)&adc_com_fil_data[i];
+        mb_param[index].set = NULL;
+        mb_param[index].get = NULL;
+        mb_param[index].check_handler = mb_check_dummy;
+        
+        index++;
+    }
+    
+    // ---------------------------------------------------------------------- //
+    
+    // Статус уставок (вкл./выкл.)
+    mb_param[index].reg = 0x03B0;
+	mb_param[index].size = 1;
+	mb_param[index].param = (uint8_t*)&settings.preset_state_bits;
+	mb_param[index].set = mb_set_preset_state;
+    mb_param[index].get = NULL;
+    mb_param[index].check_handler = mb_check_dummy;
+    
+    index++;
+    
+    // Нижнее значение уставки
+    addr = 0x03BA;
+    for (int i = 0; i < AI_COMMON_NUMBER; i++)
+    {
+        mb_param[index].reg = addr;
+        mb_param[index].size = 2;
+        mb_param[index].param = (uint8_t*)&settings.preset[i].min;
+        mb_param[index].set = NULL;
+        mb_param[index].get = NULL;
+        mb_param[index].check_handler = mb_check_dummy;
+        
+        addr += 2;
+        index++;
+    }
+    
+    // Верхнее значение уставки
+    addr = 0x03D2;
+    for (int i = 0; i < AI_COMMON_NUMBER; i++)
+    {
+        mb_param[index].reg = addr;
+        mb_param[index].size = 2;
+        mb_param[index].param = (uint8_t*)&settings.preset[i].max;
+        mb_param[index].set = NULL;
+        mb_param[index].get = NULL;
+        mb_param[index].check_handler = mb_check_dummy;
+        
+        addr += 2;
+        index++;
+    }
+    
+    // Значение гистерезиса
+    addr = 0x03EA;
+    for (int i = 0; i < AI_COMMON_NUMBER; i++)
+    {
+        mb_param[index].reg = addr;
+        mb_param[index].size = 2;
+        mb_param[index].param = (uint8_t*)&settings.preset[i].hist;
+        mb_param[index].set = NULL;
+        mb_param[index].get = NULL;
+        mb_param[index].check_handler = mb_check_dummy;
+        
+        addr += 2;
+        index++;
+    }
+    
+    return index;
+}
+
+
+// -------------------------------------------------------------------------- //
+//                          Установка параметров
+// -------------------------------------------------------------------------- //
+
+//
+mb_delay_action_t mb_set_ai_state(void)
+{
+    ai_set();
+    return MB_SAVE_SETTINGS;;
+}
+
+
+// При изменении режима измерения нужно проверить флаг аварий.
+// Если флаг установлен, то канал нельзя перевести в режим измерения тока.
+mb_delay_action_t mb_set_ai_mode(void)
+{
+    for (uint8_t i = 0; i < AI_COMMON_NUMBER; i++) 
+    {
+        if (!ai_alarm_f[i].alarm_flag)
+            settings.ai[i].mode = (uint8_t)((settings.ai_mode_bits >> i) & 1);
+        else if (((uint8_t)(settings.ai_mode_bits >> i) & 1) == 0)
+            settings.ai[i].mode = (uint8_t)((settings.ai_mode_bits >> i) & 1);
+    }  
+    ai_set_meas_mode();  
+    return MB_SAVE_SETTINGS;
+}
+
+
+//
+mb_delay_action_t mb_set_ai_gain(void)
+{
+    for (uint8_t i = 0; i < AI_COMMON_NUMBER; i++)
+    {
+        settings.ai[i].gain_factor = ai_gain[i];
+    }  
+    return MB_NO_ACTION;
+}
+
+
+//
+mb_delay_action_t mb_set_ext_sens_power(void)
+{
+    if (!ai_cur_lim.alarm_flag)
+        ai_ext_sens_power(settings.ext_sens_power);
+      
+    return MB_SAVE_SETTINGS;
+}
+
+
+// Статус уставок (вкл./выкл.)
+mb_delay_action_t mb_set_preset_state(void)
+{
+    preset_set_state();
+    return MB_SAVE_SETTINGS;
+}
+
+
+
 #endif

+ 3 - 0
fw/modules/modbus/modbus_ai_params.h

@@ -33,6 +33,9 @@ mb_delay_action_t mb_set_ai_gain(void);
 //
 mb_delay_action_t mb_set_ext_sens_power(void);
 
+//
+mb_delay_action_t mb_set_preset_state(void);
+
 
 #ifdef __cplusplus
 }

+ 1 - 1
fw/modules/modbus/modbus_params.h

@@ -16,7 +16,7 @@ extern "C" {
 #endif
 
 #if defined (MAI_12)  
-#define MB_PARAM_MAX			123  
+#define MB_PARAM_MAX			170
 #endif
 
 #if defined (MAO_4)

+ 17 - 0
fw/modules/preset/preset_ai.c

@@ -1,10 +1,27 @@
 #include "preset_ai.h"
 #include "FreeRTOS.h"
 #include "task.h"
+#include "settings_api.h"
 #include <stdio.h>
 
 #if defined (MAI_12)
 
 
+//
+void preset_set_state(void)
+{
+    for (int i = 0; i < AI_COMMON_NUMBER; i++)
+    {
+        if (((settings.preset_state_bits >> i) & 1) != settings.preset[i].state)
+        {
+            settings.preset[i].state = ((settings.preset_state_bits >> 1) & 1);
+        }
+    }
+}
+
+
+
+
+
 
 #endif

+ 11 - 4
fw/modules/preset/preset_ai.h

@@ -6,13 +6,20 @@
 
 typedef struct
 {
-    float min;
-    float max;
-    float hist;
-    uint8_t type;
+    uint8_t state;  // 0 - выкл, 1 - вкл
+    uint8_t type;   // тип, 0 - фиксированное значение
+    float min;      // минимальное значение
+    float max;      // максимальное значение
+    float hist;     // значение гистерезиса
 
 } preset_ai_t;
 
 
+
+//
+void preset_set_state(void);
+
+
+
 #endif  // __PRESET_AI_H
 

+ 18 - 0
fw/modules/settings/settings_ai.c

@@ -66,10 +66,28 @@ void settings_ai_def(settings_t *settings)
     settings->ai_add[2].name = CRNT_LIM_U_BFR_R;
     settings->ai_add[3].name = CRNT_LIM_U_ABFR_R;
     
+    // Уставки
+    
+    // Уставки по всем каналам включены
+    settings->preset_state_bits = 4095;
+    
+    // Параметры уставок
+    for (int i = 0; i < AI_COMMON_NUMBER; i++)
+    {
+        settings->preset[i].state = 1;      // включена
+        settings->preset[i].type = 0;       // тип уставки - фиксированное значение
+        settings->preset[i].hist = 5.0;     //
+        settings->preset[i].min = 0;        // TODO пока условно
+        settings->preset[i].max = 30000;    // TODO пока условно
+    }
+    
+    
     // Время ведения архива по каждому каналу (сек.)
     for (uint8_t i = 0; i < ARCH_AI_CH_NUMBER; i++) {
         settings->period_archive[i] = 3600;
     }
+    
+    
 }
 
 //

+ 5 - 1
fw/modules/settings/settings_api.h

@@ -140,7 +140,11 @@ typedef struct
     uint16_t    ai_current_mode_bits;    // режим измерения тока (0 - 0-20 мА, 1 - 4-20 mA)
     uint16_t    ext_sens_power;     // питание внешних датчиков, 0 - выкл, 1 - вкл
     
-    uint16_t    period_archive[ARCH_AI_CH_NUMBER]; // период архивирования
+    uint16_t    period_archive[ARCH_AI_CH_NUMBER];  // период архивирования
+    
+    preset_ai_t preset[AI_COMMON_NUMBER];           // уставки
+    uint16_t    preset_state_bits;  // статус уставки (0 - выкл, 1 - вкл)
+      
 #endif    
 
 #if defined (MAO_4)    

BIN
output/fw.bin


File diff suppressed because it is too large
+ 302 - 293
project/ewarm/iap/iap.dep


File diff suppressed because it is too large
+ 1047 - 1043
project/ewarm/module_universal_io.dep


+ 1 - 1
project/ewarm/module_universal_io.ewp

@@ -225,7 +225,7 @@
                     <state>AT_START_F403A_V1</state>
                     <state>PRINTF_STDLIB</state>
                     <state>DEBUG</state>
-                    <state>MAO_4</state>
+                    <state>MAI_12</state>
                 </option>
                 <option>
                     <name>CCPreprocFile</name>

+ 42 - 0
tools/ain_test.py

@@ -0,0 +1,42 @@
+from io_module import IO_Module
+from modbus import Modbus
+import colorama
+from colorama import Fore
+from time import sleep
+from serial import Serial
+from mb_registers import AiReg
+from analog_in import IO_AnalogInput
+
+
+
+def main():
+    colorama.init(autoreset=True)
+    serial_port = Serial('COM7', 115200, timeout=0.05, parity='N', xonxoff=False)
+    modbus_tester = Modbus(serial_port, 1)
+    modbus_tester.MB_DEBUG = False
+    ai = IO_AnalogInput(modbus_tester) 
+
+    '''Слово состояния уставок'''
+    # ai.set_presets_state(0b1000_1000_0000)
+    # print(ai.get_presets_state())
+
+    '''Настройки уставок 1..12'''
+    # for i in range(1, 13):
+    #     print(ai.get_preset_hist(i))
+
+    # print(ai.get_presets_min())
+    # for i in range(100):
+        # print(ai.get_preset_max(1))
+    print(ai.get_presets_hist())
+
+    for i in range(100):
+        print(ai.get_fil_inputs())
+
+
+    # print(ai.get_preset_min(2))
+
+    # print(ai.get_preset_max(2))
+
+
+if __name__ == '__main__':
+    main()

+ 55 - 4
tools/analog_in.py

@@ -5,10 +5,9 @@ import colorama
 from colorama import Fore
 from time import sleep
 from serial import Serial
-from mb_registers import AI_REGS, AiReg
 import matplotlib.pyplot as plt 
 import matplotlib.animation as animation 
-from mb_registers import SysReg
+from mb_registers import SysReg, AiReg
 
 ai_name = {'AIN_1': 0, 'AIN_2': 1, 'AIN_3': 2, 'AIN_4': 3, 'AIN_5': 4, 
            'AIN_6': 5, 'AIN_7': 6, 'AIN_8': 7, 'AIN_9': 8, 'AIN_10': 9, 
@@ -98,6 +97,52 @@ class IO_AnalogInput(IO_Module):
         return data
 
 
+    def get_presets_state(self):
+        'Значения состояний уставок вкл./выкл. (битовое поле)'
+        data = self.modbus.read_holding_registers(AiReg.PR_STATE.value, 1)
+        return format(data[0], '012b')
+
+
+    def get_preset_min(self, channel):
+        'Минимальное значение уставки'
+        return self.modbus.read_float_holding(AiReg.PR_MIN.value + 2*(channel - 1))
+
+
+    def get_presets_min(self):
+        'Минимальное значение уставок по всем каналам'
+        data = []
+        for i in range(12):
+            data.append(self.modbus.read_float_holding(AiReg.PR_MIN.value + i*2))
+        return data
+
+
+    def get_preset_max(self, channel):
+        'Маскимальное значение уставки'
+        return self.modbus.read_float_holding(AiReg.PR_MAX.value + 2*(channel - 1))
+
+
+    def get_presets_max(self):
+        'Максимальное значение уставок по все каналам'
+        data = []
+        for i in range(12):
+            data.append(self.modbus.read_float_holding(AiReg.PR_MAX.value + i*2))
+        return data
+    
+
+    def get_preset_hist(self, channel):
+        'Значение гистерезиса уставки'
+        return self.modbus.read_float_holding(AiReg.PR_HIST.value + 2*(channel - 1))
+
+
+    def get_presets_hist(self):
+        'Максимальное значение уставок по все каналам'
+        data = []
+        for i in range(12):
+            data.append(self.modbus.read_float_holding(AiReg.PR_HIST.value + i*2))
+        return data
+    
+
+
     # Установка параметров
 
 
@@ -136,6 +181,11 @@ class IO_AnalogInput(IO_Module):
         self.modbus.write_float(AiReg.IN_B_FACTOR.value + 2*(channel - 1), value)
 
 
+    def set_presets_state(self, val):
+        'Значения состояний входов вкл./выкл. (битовое поле)'
+        self.modbus.write_holding_register(AiReg.PR_STATE.value , val)
+
+
     '''Настройки входов'''
     def print_inputs(self):
         print(Fore.GREEN + '____________________________________________')
@@ -242,10 +292,11 @@ def main():
             sleep(1)
     '''
 
-    ai.sys.get_system_vars()
+    # ai.sys.set_system_vars(1234)
+    # ai.sys.get_system_vars()
     # print(ai.sys.get_bat_votage())
     # ai.sys.set_rtc()
-
+    
     # ai.sys.set_system_vars(1234)
 
     # ai.sys.get_system_vars()

+ 7 - 1
tools/mb_registers.py

@@ -5,9 +5,9 @@ reg_table = {'out_cur': 0x0200, 'out_mode': 0x0202, 'out_mode_save': 0x0203, 'pw
              'rtc_sinhro': 0x0804, 'log_info': 0x0900, 'log_ent': 0x0901, 
              'arch_cap': 0x0902, 'arch_ent': 0x0903, 'archive_per': 0x0904}
 
+
 DIO_REGS = {'load_bits': 0x0130, 'cred_bits': 0x0131, 'out_cur': 0x0200}
 
-AI_REGS = {}
 
 LOG_REGS = {'log_info': 0x0900, 'log_ent': 0x0901, 'arch_cap': 0x0902, 'arch_ent': 0x0903, 'arch_per': 0x0904}
 
@@ -48,6 +48,12 @@ class AiReg(Enum):
     IN_RAW          = 0x0360 # Канал AN_INP_1 (сырые данные)
     IN_FILTER       = 0x0380 # Фильтрованные данные с учетом K и B
 
+    PR_STATE        = 0X03B0 # Состояние уставок (вкл./выкл.)
+    PR_MIN          = 0x03BA # Нижнее значение уставок
+    PR_MAX          = 0x03D2 # Верхнее значение уставок
+    PR_HIST         = 0x03EA # Значение гистерезиса
+
+
 
 class AoReg(Enum):
 

+ 4 - 1
tools/modbus.py

@@ -50,7 +50,7 @@ class Modbus(ModbusMixin):
 
     # MB_CRC_TABLE: Sequence[int] = DEFAULT_MB_CRC_TABLE
     REF_TYPE = 6
-    MB_TIMEOUT: float = 0.5 # 0.05
+    MB_TIMEOUT: float = 0.05 # 0.05
     MB_CRC_TABLE: Sequence[int] = DEFAULT_MB_CRC_TABLE
     MB_DEBUG: bool = False
     MB_TRIES: int = 3
@@ -74,6 +74,8 @@ class Modbus(ModbusMixin):
 
     def raw_communicate(self, data: bytes, predicted_length:int = -1) -> bytes:
         """Send request and return it back with checksum"""
+        # print('start')
+        time.sleep(0.001)
         if self.MB_DEBUG:
             self.print_hex('Request:', data)
         self.serial.write(data)
@@ -87,6 +89,7 @@ class Modbus(ModbusMixin):
             elif time.time() - start_time > self.MB_TIMEOUT:
                 break
             if len(response_bytes) == predicted_length:
+                # print('!')
                 break
         if self.MB_DEBUG:
             self.print_hex('Responce:', response_bytes)

Some files were not shown because too many files changed in this diff