Forráskód Böngészése

Фильтрованные данные аналоговых входов в modbus.

TelenkovDmitry 5 hónapja
szülő
commit
0d6c4913d0

+ 29 - 23
fw/modules/io/analog_input.c

@@ -217,9 +217,15 @@ void ai_processing(void)
         adc_meas_two_channels(&settings.ai[i], &settings.ai[i + 6], 
                               &adc_com_raw_data[i], &adc_com_raw_data[i + 6]);
         
-        adc_com_data[i]     = 
-        adc_com_data[i + 6] = 
+        // ---------------------------------------------------------------------
+        // Фильтрованные данные
+        adc_com_data[i] = (float)adc_com_raw_data[i]*VOLTAGE_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*
+                              settings.ai[i + 6].k_factor + settings.ai[i + 6].b_factor;
+          
+        // ---------------------------------------------------------------------
         // Фильтрация. Скользящее среднее. Только для отладки.
         adc_com_fil_data[i]     = average_int(&average_filter[i], adc_com_raw_data[i]);
         adc_com_fil_data[i + 6] = average_int(&average_filter[i + 6], adc_com_raw_data[i + 6]);
@@ -233,7 +239,7 @@ void ai_processing(void)
     }
     
     
-#if 1    
+#if 0    
     printf("end\r\n");
     adc_print_data();
     //adc_print_data_extend();
@@ -249,6 +255,7 @@ void adc_meas_two_channels(ai_t *one, ai_t *two, uint16_t *out_one, uint16_t *ou
     // 1 - ый канал
     if (one->state == 0) {
         DBG printf("[one] channel name: %u off\r\n", one->name);
+        
     }
     else {
         DBG printf("[one] channel name: %u on\r\n", one->name);
@@ -306,27 +313,24 @@ void adc_print_data(void)
     printf("\033[2J"); 
     printf("\033[H");  
     
+#if 1    
+    printf("AN_INP_1:  0x%X, %.3f\r\n", adc_com_raw_data[0], adc_com_data[0]);
+    printf("AN_INP_2:  0x%X, %.3f\r\n", adc_com_raw_data[1], adc_com_data[1]);
+    printf("AN_INP_3:  0x%X, %.3f\r\n", adc_com_raw_data[2], adc_com_data[2]);
+    printf("AN_INP_4:  0x%X, %.3f\r\n", adc_com_raw_data[3], adc_com_data[3]);
+    printf("AN_INP_5:  0x%X, %.3f\r\n", adc_com_raw_data[4], adc_com_data[4]);
+    printf("AN_INP_6:  0x%X, %.3f\r\n", adc_com_raw_data[5], adc_com_data[5]);
+    printf("AN_INP_7:  0x%X, %.3f\r\n", adc_com_raw_data[6], adc_com_data[6]);
+    printf("AN_INP_8:  0x%X, %.3f\r\n", adc_com_raw_data[7], adc_com_data[7]);
+    printf("AN_INP_9:  0x%X, %.3f\r\n", adc_com_raw_data[8], adc_com_data[8]);
+    printf("AN_INP_10: 0x%X, %.3f\r\n", adc_com_raw_data[9], adc_com_data[9]);
+    printf("AN_INP_11: 0x%X, %.3f\r\n", adc_com_raw_data[10],adc_com_data[10]);
+    printf("AN_INP_12: 0x%X, %.3f\r\n", adc_com_raw_data[11],adc_com_data[11]);
     
-    printf("AN_INP_1: 0x%X, %.3f\r\n", adc_com_raw_data[0], (double)adc_com_raw_data[0]*VOLTAGE_FACTOR);
-            
-#if 0    
-    printf("AN_INP_1: 0x%X, %.3f\r\n", adc_com_raw_data[0], (double)adc_com_raw_data[0]*VOLTAGE_FACTOR);
-    printf("AN_INP_2: 0x%X, %f\r\n", adc_com_raw_data[1], (double)adc_com_raw_data[1]*VOLTAGE_FACTOR);
-    printf("AN_INP_3: 0x%X, %f\r\n", adc_com_raw_data[2], (double)adc_com_raw_data[2]*VOLTAGE_FACTOR);
-    printf("AN_INP_4: 0x%X, %f\r\n", adc_com_raw_data[3], (double)adc_com_raw_data[3]*VOLTAGE_FACTOR);
-    printf("AN_INP_5: 0x%X, %f\r\n", adc_com_raw_data[4], (double)adc_com_raw_data[4]*VOLTAGE_FACTOR);
-    printf("AN_INP_6: 0x%X, %f\r\n", adc_com_raw_data[5], (double)adc_com_raw_data[5]*VOLTAGE_FACTOR);
-    printf("AN_INP_7: 0x%X, %f\r\n", adc_com_raw_data[6], (double)adc_com_raw_data[6]*VOLTAGE_FACTOR);
-    printf("AN_INP_8: 0x%X, %f\r\n", adc_com_raw_data[7], (double)adc_com_raw_data[7]*VOLTAGE_FACTOR);
-    printf("AN_INP_9: 0x%X, %f\r\n", adc_com_raw_data[8], (double)adc_com_raw_data[8]*VOLTAGE_FACTOR);
-    printf("AN_INP_10: 0x%X, %f\r\n",adc_com_raw_data[9], (double)adc_com_raw_data[9]*VOLTAGE_FACTOR);
-    printf("AN_INP_11: 0x%X, %f\r\n",adc_com_raw_data[10],(double)adc_com_raw_data[10]*VOLTAGE_FACTOR);
-    printf("AN_INP_12: 0x%X, %f\r\n",adc_com_raw_data[11],(double)adc_com_raw_data[11]*VOLTAGE_FACTOR);
-    
-    printf("V_ISO_CL: 0x%X, %f\r\n", adc_add_raw_data[0], (double)adc_add_raw_data[0]*VOLTAGE_FACTOR);
-    printf("V_ISO: 0x%X, %f\r\n",    adc_add_raw_data[1], (double)adc_add_raw_data[1]*VOLTAGE_FACTOR);
-    printf("CRNT_LIM_U_BFR_R: 0x%X, %f\r\n", adc_add_raw_data[2],(double)adc_add_raw_data[2]*VOLTAGE_FACTOR);
-    printf("CRNT_LIM_U_ABFR_R: 0x%X, %f\r\n",adc_add_raw_data[3],(double)adc_add_raw_data[3]*VOLTAGE_FACTOR);
+    printf("V_ISO_CL:  0x%X, %f\r\n", adc_add_raw_data[0], (double)adc_add_raw_data[0]*VOLTAGE_FACTOR);
+    printf("V_ISO   :  0x%X, %f\r\n", adc_add_raw_data[1], (double)adc_add_raw_data[1]*VOLTAGE_FACTOR);
+    printf("CRNT_LIM_U_BFR_R : 0x%X, %f\r\n", adc_add_raw_data[2],(double)adc_add_raw_data[2]*VOLTAGE_FACTOR);
+    printf("CRNT_LIM_U_ABFR_R: 0x%X, %f\r\n", adc_add_raw_data[3],(double)adc_add_raw_data[3]*VOLTAGE_FACTOR);
 #endif
 }
 
@@ -425,6 +429,8 @@ void ai_set(void)
             settings.ai[i].state = ((settings.ai_state_bits >> i) & 1);
             if (settings.ai[i].state == 0) {
                 leds[ai_input_led[i]].state = LED_OFF;
+                adc_com_raw_data[i] = 0;
+                adc_com_data[i] = 0;                
             }
             else {
                 leds[ai_input_led[i]].state = LED_ON;

BIN
output/fw.bin


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 383 - 402
project/ewarm/iap/iap.dep


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 611 - 602
project/ewarm/module_universal_io.dep


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


+ 12 - 6
tools/analog_in.py

@@ -83,17 +83,23 @@ class IO_AnalogInput(IO_Module):
         return self.modbus.read_holding_registers(AiReg.IN_RAW.value + channel - 1, 1)[0]
 
 
-
     def get_raw_inputs(self):
-        data = self.modbus.read_holding_registers(AiReg.IN_RAW, 16)
+        'Сырые данные по всем каналам'
+        data = self.modbus.read_holding_registers(AiReg.IN_RAW.value, 16)
         return data
 
+
     def get_fil_inputs(self):
-        data = self.modbus.read_holding_registers(AI_REGS['ain_fil'], 12)
+        'Фильтрованные данные'
+        data = []
+        for i in range(12):
+            data.append(self.modbus.read_float_holding(AiReg.IN_FILTER.value + i*2))
         return data
 
+
     # Установка параметров
 
+
     def set_inputs_state(self, val):
         'Значения состояний входов вкл./выкл. (битовое поле)'
         self.modbus.write_holding_register(AiReg.IN_STATE.value , val)
@@ -214,8 +220,8 @@ def main():
 
     '''Коэффициенты K и B'''
     # for i in range(1, 13):
-    #     ai.set_k_factor(i, i + 100)
-    #     ai.set_b_factor(i, i + 1000)
+    #     ai.set_k_factor(i, 1.0)
+    #     ai.set_b_factor(i, 0.0)
 
     '''Последовательное включение входов по одному.'''
     '''
@@ -239,7 +245,7 @@ def main():
     
     # print(ai.get_inputs_state())
     # ai.set_inputs_state(0b1111_1111_1111)
-    ai.set_inputs_state(0b0000_0000_1111)
+    # ai.set_inputs_state(0b0000_0000_0000)
     # ai.set_inputs_state(0b1111_1111_1111)
     # print(ai.get_inputs_state())
     

+ 1 - 1
tools/mb_registers.py

@@ -37,7 +37,7 @@ class AiReg(Enum):
     IN_K_FACTOR     = 0x0320 # Коэффициент пересчета K
     IN_B_FACTOR     = 0x0340 # Коэффициент пересчета B
     IN_RAW          = 0x0360 # Канал AN_INP_1 (сырые данные)
-    IN_FILTER       = 0x0
+    IN_FILTER       = 0x0380 # Фильтрованные данные с учетом K и B
 
 
 class AoReg(Enum):

Nem az összes módosított fájl került megjelenítésre, mert túl sok fájl változott