Browse Source

Безопасный режим аналоговых выходов.

TelenkovDmitry 5 months ago
parent
commit
2b4370b6ab

+ 28 - 11
fw/modules/io/analog_output.c

@@ -64,24 +64,31 @@ void ao_led_update(void)
     }
 }
 
-// 
+// Включение/выключение каналов
 void ao_set(void)
 {
-    for (int i = 0; i < AO_NUMBER; i++) 
+    for (int i = 0; i < AO_NUMBER; i++)
     {
-        if (((settings.ao_state_bits >> i) & 1) != settings.ao[i].state)
-        {
-            settings.ao[i].state = ((settings.ao_state_bits >> i) & 1);
-            if (settings.ao[i].state == 0) {
-                leds[ao_output_led[i]].state = LED_OFF;
-            }
-            else {
-                leds[ao_output_led[i]].state = LED_ON;
-            }
+        settings.ao[i].state = (uint8_t)((settings.ao_state_bits >> i) & 1);
+
+        if (settings.ao[i].state == 0) {
+            leds[ao_output_led[i]].state = LED_OFF;
+        }
+        else {
+            leds[ao_output_led[i]].state = LED_ON;
         }
     }
 }
 
+// Включение/выключение каналов (безопасный режим)
+void ao_set_save(void)
+{
+    for (int i = 0; i < AO_NUMBER; i++)
+    {
+        settings.ao_save[i].state = (uint8_t)((settings.ao_state_save_bits >> i) & 1);
+    }
+}         
+         
 // Установить режим работы каналов
 void ao_set_mode(void)
 {
@@ -91,6 +98,16 @@ void ao_set_mode(void)
     }
 }
 
+// Установить режим работы каналов (безопасный режим)
+void ao_set_mode_save(void)
+{
+    for (int i = 0; i < AO_NUMBER; i++)
+    {
+        settings.ao_save[i].mode = (uint8_t)((settings.ao_mode_save_bits >> i) & 1);
+    }
+}
+         
+         
 // 
 void dac_task(void *params)
 {

+ 6 - 0
fw/modules/io/analog_output.h

@@ -22,9 +22,15 @@ void ao_led_update(void);
 // 
 void ao_set(void);
 
+// 
+void ao_set_save(void);
+
 // 
 void ao_set_mode(void);
 
+//
+void ao_set_mode_save(void);
+
 // 
 void dac_task(void *params);
 

+ 19 - 4
fw/modules/modbus/modbus_ao_params.c

@@ -31,7 +31,7 @@ uint16_t mb_init_ao_params(uint16_t i)
     mb_param[index].reg = 0x0401;
 	mb_param[index].size = 1;
 	mb_param[index].param = (uint8_t*)&settings.ao_state_save_bits;
-	mb_param[index].set = NULL;
+	mb_param[index].set = mb_set_ao_state_save;
     mb_param[index].get = NULL;
     mb_param[index].check_handler = mb_check_dummy;
     
@@ -51,7 +51,7 @@ uint16_t mb_init_ao_params(uint16_t i)
     mb_param[index].reg = 0x0403;
 	mb_param[index].size = 1;
 	mb_param[index].param = (uint8_t*)&settings.ao_mode_save_bits;
-	mb_param[index].set = NULL;
+	mb_param[index].set = mb_set_ao_mode_save;
     mb_param[index].get = NULL;
     mb_param[index].check_handler = mb_check_dummy;
     
@@ -74,7 +74,7 @@ uint16_t mb_init_ao_params(uint16_t i)
         index++;
     }
     
-    // Значения выходов в безопасном режиме. Регистры 0x0410 - 0x0413.
+    // Значения выходов в безопасном режиме. Регистры 0x0420 - 0x0423.
     addr = 0x0420;
     for (int i = 0; i < AO_NUMBER; i++)
     {
@@ -89,12 +89,12 @@ uint16_t mb_init_ao_params(uint16_t i)
         index++;
     }
     
+    
     return index;
 }
 
 
 
-
 // -------------------------------------------------------------------------- //
 //                          Установка параметров
 // -------------------------------------------------------------------------- //
@@ -106,6 +106,13 @@ mb_delay_action_t mb_set_ao_state(void)
     return MB_NO_ACTION;
 }
 
+//
+mb_delay_action_t mb_set_ao_state_save(void)
+{
+    ao_set_save();
+    return MB_NO_ACTION;
+}
+
 //
 mb_delay_action_t mb_set_ao_mode(void)
 {
@@ -113,4 +120,12 @@ mb_delay_action_t mb_set_ao_mode(void)
     return MB_SAVE_SETTINGS;
 }
 
+//
+mb_delay_action_t mb_set_ao_mode_save(void)
+{
+    ao_set_mode_save();
+    return MB_SAVE_SETTINGS;
+}
+
+
 #endif

+ 6 - 0
fw/modules/modbus/modbus_ao_params.h

@@ -24,9 +24,15 @@ uint16_t mb_init_ao_params(uint16_t i);
 //
 mb_delay_action_t mb_set_ao_state(void);
 
+//
+mb_delay_action_t mb_set_ao_state_save(void);
+
 //
 mb_delay_action_t mb_set_ao_mode(void);
 
+//
+mb_delay_action_t mb_set_ao_mode_save(void);
+
 
 
 #ifdef __cplusplus

+ 7 - 1
fw/modules/settings/settings_ao.c

@@ -18,9 +18,15 @@ void settings_ao_def(settings_t *settings)
     // Все выходы выключены
     settings->ao_state_bits = 0;
  
-    // Режим напряжения
+    // Все выходы выключены (безопасный режим)
+    settings->ao_state_save_bits = 0;
+    
+    // Режим работы выходов - напряжение
     settings->ao_mode_bits = 0;
     
+    // Режим работы выходов - напряжение (безопасный режим)
+    settings->ao_mode_save_bits = 0;
+    
     for (int i = 0; i < AO_NUMBER; i++)
     {
         settings->ao[i].state = 0;  // выход выключен

+ 1 - 1
fw/user/main.cpp

@@ -107,7 +107,7 @@ void init_task(void *argument)
     // Настройки параметров порта Modbus
     settings_set_modbus_params(settings.com_settings.mb_port);
     
-#if 1
+#if 0
 // Только для теста    
     settings_set_all_default();
     settings_save(&settings);

BIN
output/fw.bin


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


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


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


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


+ 57 - 16
tools/analog_out.py

@@ -5,8 +5,7 @@ import colorama
 from colorama import Fore
 from time import sleep
 from serial import Serial
-from mb_registers import AO_REGS
-
+from mb_registers import AoReg
 
 class IO_AnalogOutput(IO_Module):
 
@@ -18,21 +17,57 @@ class IO_AnalogOutput(IO_Module):
 
     # Значения состояний выходов вкл./выкл. (битовое поле)
     def get_outputs_state(self):
-        data = self.modbus.read_holding_registers(AO_REGS['aout_state'], 1)
+        data = self.modbus.read_holding_registers(AoReg.OUT_STATE.value, 1)
+        if self.DBG: 
+            print(Fore.GREEN +  f'Read reg {[hex(AoReg.OUT_STATE.value)]} outputs state: {format(data[0], '04b')}')
+        return format(data[0], '04b')
+
+    # Значения состояний выходов вкл./выкл. в безопасном режиме (битовое поле)
+    def get_outputs_state_save(self):
+        data = self.modbus.read_holding_registers(AoReg.OUT_STATE_SAVE.value, 1)
+        if self.DBG: 
+            print(Fore.GREEN +  f'Read reg {[hex(AoReg.OUT_STATE_SAVE.value)]} outputs state (SAVE MODE): {format(data[0], '04b')}')
         return format(data[0], '04b')
 
-    # Режим аналоговых выходов (0 - напряжение или 1 - ток. (битовое поле))
+    # Режим работы аналоговых выходов (0 - напряжение или 1 - ток. (битовое поле))
     def get_outputs_mode(self):
-        data = self.modbus.read_holding_registers(AO_REGS['aout_mode'], 1)
+        data = self.modbus.read_holding_registers(AoReg.OUT_MODE.value, 1)
+        if self.DBG: 
+            print(Fore.GREEN +  f'Read reg {[hex(AoReg.OUT_MODE.value)]} outputs mode: {format(data[0], '04b')}')
+        return format(data[0], '04b')
+
+    # Режим работы аналоговых выходов (0 - напряжение или 1 - ток. (битовое поле))
+    def get_outputs_mode_save(self):
+        data = self.modbus.read_holding_registers(AoReg.OUT_MODE_SAVE.value, 1)
+        if self.DBG: 
+            print(Fore.GREEN +  f'Read reg {[hex(AoReg.OUT_MODE_SAVE.value)]} outputs mode (SAVE MODE): {format(data[0], '04b')}')
         return format(data[0], '04b')
 
     '''Установка параметров'''
 
+    # Значения состояний выходов вкл./выкл. (битовое поле)
     def set_outputs_state(self, val):
-        self.modbus.write_holding_register(AO_REGS['aout_state'], val)
+        if self.DBG:
+            print(Fore.BLUE +  f'Write reg {[hex(AoReg.OUT_STATE.value)]} outputs state: {format(val, '04b')}')
+        self.modbus.write_holding_register(AoReg.OUT_STATE.value, val)
 
-    def set_inputs_mode(self, val):
-        self.modbus.write_holding_register(AO_REGS['aout_mode'], val)
+    # Значения состояний выходов вкл./выкл. в безопасном режиме (битовое поле)
+    def set_outputs_state_save(self, val):
+        if self.DBG:
+            print(Fore.BLUE +  f'Write reg {[hex(AoReg.OUT_STATE_SAVE.value)]} outputs state (SAVE MODE): {format(val, '04b')}')
+        self.modbus.write_holding_register(AoReg.OUT_STATE_SAVE.value, val)
+
+    # Значения состояний выходов вкл./выкл. (битовое поле)
+    def set_outputs_mode(self, val):
+        if self.DBG:
+            print(Fore.BLUE +  f'Write reg {[hex(AoReg.OUT_MODE.value)]} outputs mode (SAVE MODE): {format(val, '04b')}')
+        self.modbus.write_holding_register(AoReg.OUT_MODE.value, val)
+
+    # Значения состояний выходов вкл./выкл. в безопасном режиме (битовое поле)
+    def set_outputs_mode_save(self, val):
+        if self.DBG:
+            print(Fore.BLUE +  f'Write reg {[hex(AoReg.OUT_MODE_SAVE.value)]} outputs mode (SAVE MODE): {format(val, '04b')}')
+        self.modbus.write_holding_register(AoReg.OUT_MODE_SAVE.value, val)
 
 
 
@@ -41,16 +76,22 @@ def main():
     serial_port = Serial('COM24', 115200, timeout=0.05, parity='N', xonxoff=False)
     ao_modbus = Modbus(serial_port, 8)
     ao = IO_AnalogOutput(ao_modbus)
+    ao.DBG = True
 
     '''Тесты отдельного модуля аналоговых выходов'''
-    ao.sys.get_system_vars()
-
-    '''Чтение параметров'''
-    # print(ao.get_outputs_state())
-    # print(ao.get_outputs_state())
-
-    '''Установка параметров'''
-    # ao.set_outputs_state(0b1111)
+    # ao.sys.get_system_vars()
+        
+    '''Настройка аналоговых выходов'''
+    ao.set_outputs_state(0b1111)
+    ao.set_outputs_state_save(0b1111)
+    ao.set_outputs_mode(0b0101)
+    ao.set_outputs_mode_save(0b1010)
+
+    '''Чтение режимов работы аналоговых выходов'''
+    ao.get_outputs_state()
+    ao.get_outputs_state_save()
+    ao.get_outputs_mode()
+    ao.get_outputs_mode_save()
 
     '''Сохранение настроек'''
     # ao.sys.save_sattings()

+ 1 - 0
tools/io_module.py

@@ -14,6 +14,7 @@ class IO_Module:
         self.modbus = modbus
         self.updater = Updater(self.modbus)
         self.sys = IO_SysParams(self.modbus)
+        self.DBG = False
 
 '''
     

+ 15 - 2
tools/mb_registers.py

@@ -1,3 +1,5 @@
+from enum import Enum
+
 reg_table = {'out_cur': 0x0200, 'out_mode': 0x0202, 'out_mode_save': 0x0203, 'pwm_duty': 0x0210,
              'pwm_duty_save': 0x0220, 'pwm_per': 0x0230, 'pwm_per_save': 0x0240,
              'param_manager': 0x0800, 'rtc_unix': 0x0802, 'rtc_sinhro': 0x0804, 'uptime': 0x0801, 
@@ -13,6 +15,17 @@ DIO_REGS = {'in_bits': 0x0100, 'in_cnt': 0x0102,'in_mode': 0x0120, 'in_norm': 0x
 AI_REGS = {'ain_state': 0x0300, 'ain_mode': 0x0301, 'ain_alarm': 0x0302, 'esens_pow': 0x0303, 
            'ain_gain': 0x0310, 'ain_raw': 0x0320, 'ain_fil': 0x0330}
 
-AO_REGS = {'aout_state': 0x0400, 'aout_mode': 0x0401}
+LOG_REGS = {'log_info': 0x0900, 'log_ent': 0x0901, 'arch_cap': 0x0902, 'arch_ent': 0x0903, 'arch_per': 0x0904}
+
+
+class AoReg(Enum):
+
+    OUT_STATE       = 0x0400 # статус выходов
+    OUT_STATE_SAVE  = 0x0401 # статус выходов (безопасный режим)
+    OUT_MODE        = 0x0402 # режим работы выходов (напряжение/ток)
+    OUT_MODE_SAVE   = 0x0403 # режим работы выходов (безопасный режим)
+
+    OUT_VALUE       = 0x0410 # Значение на выходе    
 
-LOG_REGS = {'log_info': 0x0900, 'log_ent': 0x0901, 'arch_cap': 0x0902, 'arch_ent': 0x0903, 'arch_per': 0x0904}
+    OUT_VALUE_SAVE  = 0x0420 # Значение на выходе (безопасный режим)   
+    

+ 7 - 0
tools/tools.code-workspace

@@ -0,0 +1,7 @@
+{
+	"folders": [
+		{
+			"path": "."
+		}
+	]
+}

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