Думаю правильно ли такой подход:
всю логику обработки данных с каждого МВ я прописал внутри CASE и что то мне кажется что на обработку каждого канала не будет хватать времени или этот код внутри будет отработан синхронно и не переключится на опрос следующего МВ пока не завершится код до END_CASE?
Код:
IF last_error = 0 THEN
k := DWORD_TO_INT( last_address - 15);
CASE k OF 1..7:
compressors[k].bSignal1 := 0;
IF BIT_OF_BYTE(on_off, (k - 1)) = TRUE THEN (* Если компрессор включен то выполняем считывание и заполнение данными*)
compressors[k].bSignal1 := 1;
FOR i := 1 TO 8 DO (* Записываем данные по 8 каналам МВ*)
all_ai[k].ai[i].status := original_8AC[k].SRD[i];
p := ADR(all_ai[k].ai[i].value);
p^ := 0;
all_ai[k].ai[i].cyclic := 0;
IF original_8AC[k].SRD[i] = 0 THEN (* если статус измерения успешен*)
all_ai[k].ai[i].cyclic := original_8AC[k].Read[i,3];
p^ := original_8AC[k].Read[i,1] * 16#10000 + original_8AC[k].Read[i,2];
CASE i OF
1 : compressors[k].t_1st := REAL_TO_INT( all_ai[k].ai[i].value );
2 : compressors[k].t_2st := REAL_TO_INT (all_ai[k].ai[i].value );
3 : compressors[k].t_oil := REAL_TO_INT ( all_ai[k].ai[i].value );
4 : compressors[k].P_1st := all_ai[k].ai[i].value;
5 : compressors[k].P_2st := all_ai[k].ai[i].value;
6 : compressors[k].P_oil := all_ai[k].ai[i].value;
7 : compressors[k].P_water := all_ai[k].ai[i].value;
END_CASE;
IF compressors[k].t_1st > ust_T1st THEN
compressors[k].bSignal2.0 := Alarm(k, temp_1st);
END_IF
IF compressors[k].t_2st > ust_T2st THEN
compressors[k].bSignal2.1 := Alarm(k, temp_2st);
END_IF
IF compressors[k].t_oil > ust_Toil THEN
compressors[k].bSignal2.2 := Alarm(k, temp_oil);
END_IF
IF compressors[k].P_1st > ust_P1st THEN
compressors[k].bSignal2.3 := Alarm(k, davl_1st);
END_IF
IF compressors[k].P_2st > ust_P2st THEN
compressors[k].bSignal2.4 := Alarm(k, davl_2st);
END_IF
(* Таймер при включении компрессора от сработки по нижнему давлению масла*)
TON_1( IN := BYTE_TO_BOOL( compressors[k].bSignal1), PT := timer_start );
IF TON_1.Q = TRUE THEN
IF compressors[k].P_oil < ust_Poil_min THEN
compressors[k].bSignal2.5 := Alarm(k, davl_oil_min);
END_IF
END_IF
IF compressors[k].P_oil > ust_Poil_max THEN
compressors[k].bSignal2.5 := Alarm(k, davl_oil_max);
END_IF
IF compressors[k].P_water < ust_Pwater THEN
(* compressors[k].bSignal2.6 := Alarm(k, davl_water) *);
END_IF
END_IF
END_FOR
END_IF
END_CASE
END_IF
last_error := 0;