Сообщение от
Easy_Enemy
...
Фактически, все свелось к тому, что нельзя запихать выход в массив. То есть, можно это обойти, если это простые дискретные выходы через ADR, но, видимо не канает с быстрыми..
Вероятность того, что структуры ваших внутренних объектов совпадут с типами и расположением физических входов и выходов в контроллере - приближается к нулю. Поэтому я например делаю так:
Объявляю глобальные переменные физических входов и выходов типа такого:
Код:
DI_1 AT %IX0.0 : BOOL; (* Дискретный вход 1 *)
DI_2 AT %IX0.1 : BOOL; (* Дискретный вход 2 *)
DI_3 AT %IX1.0.0 : BOOL; (* Дискретный вход 5 *)
DI_4 AT %IX1.0.1 : BOOL; (* Дискретный вход 6 *)
DI_5 AT %IX1.0.2 : BOOL; (* Дискретный вход 7 *)
DI_6 AT %IX1.0.3 : BOOL; (* Дискретный вход 8 *)
...
DO_1 AT %QX2.0 : BOOL; (* Дискретный выход 1 *)
DO_2 AT %QX2.1 : BOOL; (* Дискретный выход 2 *)
DO_3 AT %QX2.2 : BOOL; (* Дискретный выход 3 *)
DO_4 AT %QX2.3 : BOOL; (* Дискретный выход 4 *)
DO_5 AT %QX3.0.0 : BOOL; (* Дискретный выход 5 *)
DO_6 AT %QX3.0.1 : BOOL; (* Дискретный выход 6 *)
...
(можно конечно забить имена прямо в конфигурацию, но мне так удобнее, и нет проблем при смене конфигурации).
В отдельной программе, которая выполняется в отдельной задаче со свободным циклом выполнения делаю их присваивание/чтение:
Код:
arBlock[1]. xInStart := DI_5 ; (* *)
arBlock[1]. xInStop := DI_6 ; (* *)
...
DO_5 := arBlock[1]. xOutStart ; (* *)
DO_6 := arBlock[1]. xOutAlarm ; (* *)
...
Уж не знаю, насколько это "медленней" по сравнению с работой со входами/выходами через байты - но подозреваю, что несущественно.
Но при этом вы не привязаны к расположению входов/выходов в структурах и можно в любой момент "отключить" физические входы/выходы для, например, 'эмуляции процесса