Se_Sib,
Организовал в программе цикл опроса с помощью блоков READ_VAR, WRITE_VAR.
Да, действительно, все стало опрашиваться намного быстрее.
Но есть вопрос. В каждом из этих блоков есть входная переменная abort.
Какое у нее функциональное предназначение? Когда я перевожу ее в true на одном из блоков - у меня останавливается весь организованный мною цикл опроса.
Она предназначена для исключения одного блока из общего цикла опроса?
Как тогда ею правильно пользоваться, чтобы организовать адаптивный алгоритм опроса.
Например, если устройство перешло офлайн, опрашивать его, например, 1 раз за 5 циклов опроса.
Или как, используя эту переменную блока (abort) - писать переменные с помощью блока WRITE_VAR только когда в этом есть необходимость, т.е. в остальное время - чтобы эти блоки были неактивны в общем цикле.
И каково практическое применение выходной переменной этих блоков aborted?
Привожу свой код цикла опроса (как я его понял из мануала)
Код
ADDM_1(
AddrTable:= ADDR_SL,
Execute:= NOT start_4,
Addr:= '2.1',
Done=> ADDM_DONE,
Error=> ADDM_ERR,
CommError=> ADDM_COMM_ERR_1);
READ_VAR_1(
Execute:= ADDM_DONE,
Abort:= Abort_read_var_1,
Addr:= ADDR_SL,
Timeout:= comm_timeout_g,
Done=> Done_Read_Var_1,
Busy=> start_1,
Aborted=> Aborted_read_var_1,
Error=> Err_read_var_1,
CommError=> Comm_err_read_var_1,
OperError=> OperErr_read_var_1,
ObjType:= ObjectType.MW,
FirstObj:= 0,
Quantity:= 3,
Buffer:= (ADR(ReceiveBufferMW_G1)));
air_temp_setp_r_1 := ReceiveBufferMW_G1[0];
g_last_fault_r_1 := ReceiveBufferMW_G1[2];
READ_VAR_2
(
Execute:= NOT start_1,
Abort:= Abort_read_var_2,
Addr:= ADDR_SL,
Timeout:= comm_timeout_g,
Done=> Done_Read_Var_2,
Busy=> start_2,
Aborted=> Aborted_read_var_2,
Error=> Err_read_var_2,
CommError=> Comm_err_read_var_2,
OperError=> OperErr_read_var_2,
ObjType:= ObjectType.IW,
FirstObj:= 1,
Quantity:= 5,
Buffer:= (ADR(ReceiveBufferIW_G1)));
air_temp_1 := ReceiveBufferIW_G1[0];
g_status_1 := ReceiveBufferIW_G1[2];
g_val_pwr_1 := ReceiveBufferIW_G1[3];
g_val_time_1 := ReceiveBufferIW_G1[4];
SendBufferQ_G1[0] := com_g_start_1;
WRITE_VAR_1(
Execute:= NOT start_2,
Abort:= Abort_write_var_1,
Addr:= ADDR_SL,
Timeout:= comm_timeout_g,
Done=> Done_write_var_1,
Busy=> start_3_1,
Aborted=> Aborted_write_var_1,
Error=> Err_write_var_1,
CommError=> Comm_err_var_1,
OperError=> OperErr_write_var_1,
ObjType:= ObjectType.Q,
FirstObj:= 16,
Quantity:= 1,
Buffer:= ADR(SendBufferQ_G1));
SendBufferQ1_G1[0] := com_g_stop_1;
WRITE_VAR_1_1(
Execute:= NOT start_3_1,
Abort:= Abort_write_var_1_1,
Addr:= ADDR_SL,
Timeout:= comm_timeout_g,
Done=> Done_write_var_1_1,
Busy=> start_3,
Aborted=> Aborted_write_var_1_1,
Error=> Err_write_var_1_1,
CommError=> Comm_err_var_1_1,
OperError=> OperErr_write_var_1_1,
ObjType:= ObjectType.Q,
FirstObj:= 25,
Quantity:= 1,
Buffer:= ADR(SendBufferQ1_G1));
SendBufferMW_G1[0] := air_temp_setp_w_1;
SendBufferMW_G1[2] := g_last_fault_w_1;
WRITE_VAR_2(
Execute:= NOT start_3,
Abort:= Abort_write_var_2,
Addr:= ADDR_SL,
Timeout:= comm_timeout_g,
Done=> Done_write_var_2,
Busy=> start_4,
Aborted=> Aborted_write_var_2,
Error=> Err_write_var_2,
CommError=> Comm_err_var_2,
OperError=> OperErr_write_var_2,
ObjType:= ObjectType.MW,
FirstObj:= 0,
Quantity:= 3,
Buffer:= ADR(SendBufferMW_G1));
online_G_1 := (ADDM_COMM_ERR_1 = 0) AND (Comm_err_read_var_1 = 0) AND
(Comm_err_read_var_2 = 0) AND (Comm_err_var_1 = 0) AND (Comm_err_var_2 = 0);
Еще есть нюанс один.
Пытался записать с помощью блока WRITE_VAR - два coils - 16, 17. 16 - в устройство пишется, 17 - нет. Т.е. пишется только первый койл. Попробовал несоседние койлы писать - та же история. Создал отдельный блок WRITE_VAR для второго (17) койла - тоже не пишется. Несоседний койл(25), спомощью отдельно созданного для него блока WRITE_VAR - записался. Или я что-то неправильно делаю, или что-то не то с программой. Если я делаю неправильно, то как правильно организовывать цикл опроса с использованием в одном цикле - нескольких блоков? В справке и мануалах - приведены примеры только для одного блока в цикле, один блок ADDM, один блок например READ_VAR.
Из мануала ясно, что переменная Abort - сбрасывает выходную переменную Busy,

что делает возможным старт следующего блока в общем цикле. Но когда я взвожу эту переменную на одном из блоков - у меня останавливается весь цикл опроса (см мой код выше).