Bladeren bron

DIO, AI, python.

TelenkovDmitry 5 maanden geleden
bovenliggende
commit
5283d1ddc9

+ 43 - 16
doc/misc.c

@@ -1,20 +1,47 @@
+
+
 //
-void io_test(void)
+void ai_base_init(void)
 {
-#if 0  
-    printf("IN_1: %u IN_2: %u IN_3: %u IN_4: %u IN_5: %u IN_6: %u IN_7: %u IN_8: %u\r\n", 
-           gpio_input_data_bit_read(inputs[0].port, inputs[0].pin),
-           gpio_input_data_bit_read(inputs[1].port, inputs[1].pin),
-           gpio_input_data_bit_read(inputs[2].port, inputs[2].pin),
-           gpio_input_data_bit_read(inputs[3].port, inputs[3].pin),
-           gpio_input_data_bit_read(inputs[4].port, inputs[4].pin),
-           gpio_input_data_bit_read(inputs[5].port, inputs[5].pin),
-           gpio_input_data_bit_read(inputs[6].port, inputs[6].pin), 
-           gpio_input_data_bit_read(inputs[7].port, inputs[7].pin));
+    for (uint8_t i = 0; i < AI_NUMBER; i++)
+    {
+        if (settings.ai[i].state) {
+            ai_state_bit |= 1 << i;
+            leds[ai_input_led[i]].state = LED_ON;
+        }
+        else {
+            ai_state_bit &= ~(1 << i);
+            leds[ai_input_led[i]].state = LED_OFF;
+        }
+    }
+}
+
+
+//
+void ao_init(void)
+{
+    // Обновление состояний LED
+    // Зеленые LED сигнализируют (вкл/выкл) входов. Проверка на безопасный режим.
+    if (save_mode_get())
+        ao_led_update(settings.ao_save);
+    else 
+        ao_led_update(settings.ao);
     
+    // Сдвиговые регистры
+    sh_init();
     
-    printf("IN_1: %u IN_2: %u IN_3: %u IN_4: %u IN_5: %u IN_6: %u IN_7: %u IN_8: %u\r\n", 
-           di_cnt[0], di_cnt[1], di_cnt[2], di_cnt[3], 
-           di_cnt[4], di_cnt[5], di_cnt[6], di_cnt[7]);
-#endif    
-}
+    // Внешний DAC
+    dac_init();
+    
+    // Режир работы выходов.
+    // При старте проверяется состояние безопасного режима в настройках
+    if (save_mode_get()) {
+        ao_mode = settings.ao_mode_save_bits;
+    }
+    else {
+        ao_mode = settings.ao_mode_bits;
+    }
+    
+    // Флаг - нужно обновить значения на выходах
+    ao_set_value_flag();
+}

+ 8 - 2
fw/modules/io/analog_input.c

@@ -201,6 +201,7 @@ bool ai_adc_init(void)
 // Оцифровка всех 16-и каналов (входы + дополнительные каналы)
 void ai_processing(void)
 {
+    float filter_factor;
 #if 0
     adc_meas_two_channels(&settings.ai[0], &settings.ai[0 + 6], 
                               &adc_com_raw_data[0], &adc_com_raw_data[0 + 6]);
@@ -219,10 +220,15 @@ void ai_processing(void)
         
         // ---------------------------------------------------------------------
         // Фильтрованные данные
-        adc_com_data[i] = (float)adc_com_raw_data[i]*VOLTAGE_FACTOR*
+        
+        filter_factor = settings.ai[i].mode == 0 ? VOLTAGE_FACTOR : CURRENT_FACTOR;
+          
+        adc_com_data[i] = (float)adc_com_raw_data[i]*filter_factor*
                           settings.ai[i].k_factor + settings.ai[i].b_factor;
         
-        adc_com_data[i + 6] = (float)adc_com_raw_data[i + 6]*VOLTAGE_FACTOR*
+        filter_factor = settings.ai[i + 6].mode == 0 ? VOLTAGE_FACTOR : CURRENT_FACTOR;
+        
+        adc_com_data[i + 6] = (float)adc_com_raw_data[i + 6]*filter_factor*
                               settings.ai[i + 6].k_factor + settings.ai[i + 6].b_factor;
           
         // ---------------------------------------------------------------------

+ 2 - 0
fw/modules/io/digital_output.c

@@ -11,6 +11,7 @@
 
 uint16_t output_state_bit;
 uint16_t output_mode_bit;
+uint16_t output_mode_save_bit;
 uint16_t output_pwm[DO_NUMBER];
 uint16_t output_pwm_save[DO_NUMBER];
 uint16_t output_pwm_period[DO_NUMBER];
@@ -35,6 +36,7 @@ void do_init(void)
 {
     output_state_bit = settings.do_bits;
     output_mode_bit = settings.do_mode_bits;
+    output_mode_save_bit = settings.do_mode_save_bits;
     
     // Таймер для выходов в режиме PWM
     di_out_pwm_tim_init();

+ 12 - 2
fw/modules/modbus/modbus_dio_params.c

@@ -119,7 +119,7 @@ uint16_t mb_init_dio_params(uint16_t i)
     // -------------------------------------------------------------------------
     // Параметры дискретных выходов
     
-    // Текущее состояние выходов
+    // Статус выходов вкл./выкл.
     mb_param[index].reg = 0x0200;
 	mb_param[index].size = 1;
 	mb_param[index].param = (uint8_t*)&settings.do_state_bits;  
@@ -149,8 +149,18 @@ uint16_t mb_init_dio_params(uint16_t i)
     
     index++;
     
-    // Состояние выходов в безопасном режиме
+    // Режим работы выходов в безопасном режиме
     mb_param[index].reg = 0x0203;
+	mb_param[index].size = 1;
+	mb_param[index].param = (uint8_t*)&settings.do_mode_save_bits;  
+	mb_param[index].set = NULL;
+    mb_param[index].get = NULL;
+    mb_param[index].check_handler = mb_check_dummy;
+    
+    index++;
+    
+    // Состояние выходов в безопасном режиме
+    mb_param[index].reg = 0x0204;
 	mb_param[index].size = 1;
 	mb_param[index].param = (uint8_t*)&settings.do_save_bits;  
 	mb_param[index].set = mb_set_do;

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

@@ -12,7 +12,7 @@ extern "C" {
 #endif
 
 #if defined (MDIO_88)  
-#define  MB_PARAM_MAX			93
+#define  MB_PARAM_MAX			94
 #endif
 
 #if defined (MAI_12)  

+ 4 - 3
fw/modules/settings/settings_api.h

@@ -122,11 +122,12 @@ typedef struct
     do_t        dout[DO_NUMBER];    // 
     uint16_t    do_state_bits;      //    
     
-    uint16_t    di_mode_bits;          // режим работы, 0 - вход, 1 - счетчик импульсов
-    uint16_t    di_norm_state_bits;    // нормальное состояние (0 - разомкнут, 1 - замкнут)        
-    uint16_t    di_debounce[DI_NUMBER]; // Дискретные входы
+    uint16_t    di_mode_bits;           // режим работы, 0 - вход, 1 - счетчик импульсов
+    uint16_t    di_norm_state_bits;     // нормальное состояние (0 - разомкнут, 1 - замкнут)        
+    uint16_t    di_debounce[DI_NUMBER]; // дискретные входы
     
     uint16_t    do_mode_bits;       // режим работы выхода 0 - выход, 1 - ШИМ
+    uint16_t    do_mode_save_bits;  // режим работы выхода в безопасном режиме 0 - выход, 1 - ШИМ
     uint16_t    do_bits;            // последнее сохраненное значение на выходах
     uint16_t    do_save_bits;       // значение на выходах в бесопасном режиме работы
     uint16_t    do_pwm[DO_NUMBER];  // значение заполнения ШИМ

+ 3 - 2
fw/modules/settings/settings_dio.c

@@ -47,8 +47,9 @@ void settings_do_def(settings_t *settings)
         settings->dout[i].state = 0;
     }
   
-    settings->do_mode_bits = 0; // режим работы выхода (обычный выход)
-    settings->do_bits = 0;      // последнее сохраненное значение 
+    settings->do_mode_bits = 0;     // режим работы выхода (обычный выход)
+    settings->do_state_bits = 0;    // режим работы выхода в безопасном режиме (обычный выход)
+    settings->do_bits = 0;          // последнее сохраненное значение 
     settings->do_save_bits = 0;
     
     for (uint8_t i = 0; i < DO_NUMBER; i++)

BIN
output/fw.bin


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


File diff suppressed because it is too large
+ 996 - 991
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>MAI_12</state>
+                    <state>MDIO_88</state>
                 </option>
                 <option>
                     <name>CCPreprocFile</name>

BIN
tools/__pycache__/io_module.cpython-312.pyc


BIN
tools/__pycache__/mb_registers.cpython-312.pyc


+ 48 - 13
tools/digital_io.py

@@ -1,4 +1,4 @@
-from io_module import IO_Module
+from io_module import IO_Module, SysUtils
 from modbus import Modbus, MBError, NoResponseError
 from log_reader import DigitalLogReader
 import colorama
@@ -90,31 +90,60 @@ class IO_Digital(IO_Module):
 
 
     '''Запрос параметров дискретных входов'''
-
-    # 0x0200 - Состояние выходов (вкл./выкл.)
+    
     def get_outputs_state(self):
-        data = self.modbus.read_holding_registers(DioReg.OUT_STATE.value , 1)
+        'Состояние выходов (вкл./выкл.)'
+        data = self.modbus.read_holding_registers(DioReg.OUT_STATE.value, 1)
         return format(data[0], '08b')
 
+
+    def get_outputs(self):
+        'Текущее состояние выходов'
+        data = self.modbus.read_holding_registers(DioReg.OUT_BITS.value, 1)
+        return format(data[0], '0b8')
+
+
+    def get_outputs_mode(self):
+        'Режим работы выходов'
+        data = self.modbus.read_holding_registers(DioReg.OUT_MODE.value, 1)
+        return format(data[0], '0b8')
+    
+
+    def get_outputs_mode_save(self):
+        'Режим работы выходов в безопасном режиме'
+        data = self.modbus.read_holding_registers(DioReg.OUT_MODE_SAVE.value, 1)
+        return format(data[0], '0b8')
+    
+
     '''Установка параметров дискретных выходов'''
 
-    # 0x0200 - Состояние выходов (вкл./выкл.)
+
     def set_outputs_state(self, val):
+        'Состояние выходов вкл./выкл. (битовое поле)'
         self.modbus.write_holding_register(DioReg.OUT_STATE.value, val)
 
-    # 0x0201 - текущее состояние выходов в обычном режиме
+    
     def set_outputs(self, val):
+        'Текущее состояние выходов в обычном режиме'
         self.modbus.write_holding_register(DioReg.OUT_BITS.value, val)
 
-    # 0x0201 - Установить значение на конкретном выходе [1..8]
+    
     def set_output(self, output, val):
+        'Установить значение на конкретном выходе [1..8]'
         ret = self.modbus.read_holding_registers(DioReg.OUT_BITS.value, 1)
-        if val == 1:
-            data = ret[0] | (0b1 << (output - 1))
-        else:
-            data = ret[0] & ~(0b1 << (output - 1))
-        self.set_outputs(data)
+        self.set_outputs(SysUtils.set_bit(ret, output - 1, val))
+
 
+    def set_outputs_mode(self, val):
+        'Режим работы выходов (битовое поле)'
+        self.modbus.write_holding_register(DioReg.OUT_MODE.value, 1)
+
+
+    def set_output_mode(self, output, val):
+        'Установить режим работы конкретного выхода [1..8]'
+        ret = self.modbus.read_holding_registers(DioReg.OUT_MODE.value, 1)[0]
+        self.set_outputs_mode(SysUtils.set_bit(ret, output - 1, val))
+        
 
     def print_inputs(self):
 
@@ -246,6 +275,12 @@ def main():
     #     tester.get_load()
 
     '''Выходы'''
+
+    # print(dio.get_outputs())
+    !!!
+    # dio.set_output_mode(3, 0)
+    # print(dio.get_inputs_mode())
+
     # for i in range(100):
     #     dio.set_outputs(0b00000001)
     #     sleep(1)
@@ -254,7 +289,7 @@ def main():
 
     '''Системные переменные и параметры'''
     # dio.sys.get_system_vars()
-    print(dio.sys.get_bat_votage())
+    # print(dio.sys.get_bat_votage())
 
     ''' Установить текущее время с учетом часового пояса'''
     # dev.sys.set_rtc()     

+ 21 - 14
tools/io_module.py

@@ -9,6 +9,21 @@ import struct
 import random
 
 
+class SysUtils:
+
+    @staticmethod
+    def set_bit(word, number, bit):
+        """Установка/снятие бита"""
+        if bit not in (0, 1):
+            return None
+        if bit == 1:
+            word |= 0b1 << number
+        else:
+            word &= ~(0b1 << number)
+        return word
+
+
+
 class IO_Module:
     def __init__(self, modbus: Modbus):
         self.modbus = modbus
@@ -110,22 +125,14 @@ class IO_Module:
 
 
 def main():
-    colorama.init(autoreset=True)
-    dev = IO_Module('COM24', 115200, 15)
-    dev.MB_DEBUG = False
-    
-    # dev.update('fw.bin')
-
-    # print('Device uptime:', dev.get_uptime())
-    # unix_time = dev.get_rtc()
-    # print(f'RTC: {time.ctime(unix_time)}. Unix time stamp:  {unix_time}')
-    # print('Set time:', int(time.time()))
-    # dev.set_rtc(int(time.time()))
-    # time.sleep(1)
-    # unix_time = dev.get_rtc()
-    # print(f'RTC: {time.ctime(unix_time)}. Unix time stamp:  {unix_time}')
+    # colorama.init(autoreset=True)
+    # dev = IO_Module('COM24', 115200, 15)
+    # dev.MB_DEBUG = False
     
+    print(format(SysUtils.set_bit(0b1111_0000_0000, 0, 1), '12b'))
     
+
+
     return
 
     for i in range(1, 9):

+ 3 - 0
tools/mb_registers.py

@@ -23,6 +23,9 @@ class DioReg(Enum):
 
     OUT_STATE       = 0x0200 # Состояние выходов (вкл./выкл.)
     OUT_BITS        = 0x0201 # Текущее состояние выходов    
+    OUT_MODE        = 0x0202 # Режим работы выходов (битовое поле)
+    OUT_MODE_SAVE   = 0x0203 # Режим работы выходов в безопасном режиме (битовое поле) 
+
 
 
 class AiReg(Enum):

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