Я на недавнем объекте связывал ПЛК110 с двумя СПК110, которые используются чисто как операторский интерфейс.

Обе панели подключаются каждая на свой порт контроллера: одна — на RS-232, другая — на RS-485-2. В конфигураторе контроллера создаётся ветка Modbus (slave), в которую набиваются нужные регистры (они будут нумероваться с нуля) и добавляются оба интерфейса. Панели настраиваются на опрос этих регистров. Обе панели совершенно равнозначны, на них записана одна и та же программа. Схема масштабируется в обе стороны — так же легко можно подключить и одну панель, и десять (было бы столько портов у контроллера) с минимальным копипастом. Задержек (лагов) нет.

Первые четыре модбас-регистра отводятся на передачу команд от панелей контроллеру — эти регистры записываются панелями только когда оператор вызывает команду. Остальные 39 регистров считываются панелями с периодом 33 мс одним скопом. На стороне контроллера эти регистры формируются очень просто:
Код:
SAFlags.2 := PLC_PRG.RegenEnabled;
SAUnitStatesLo.0 := heater;
SAUnitStatesLo.1 := ik29;
SAUnitStatesLo.2 := ik1;
SAUnitStatesLo.3 := ik2;
SAUnitStatesLo.4 := ik3;
...
где SAUnitStatesLo, например, это имя регистра в конфигураторе контроллера (см. скриншот ниже). Аналогичным образом эти WORD'ы потом разбиваются по битам на панелях:
Код:
(* 2 byte SAUnitStatesLo *)
reg := 1;
heater := mbusRaw[reg].0;
kpz[29] := mbusRaw[reg].1;
kpz[1] := mbusRaw[reg].2;
kpz[2] := mbusRaw[reg].3;
kpz[3] := mbusRaw[reg].4;
kpz[4] := mbusRaw[reg].5;
где kpz — заранее объявленный массив, mbusRaw — заранее объявленный массив с привязкой к каналу чтения регистров. Изначально я пробовал сделать разделение регистров на панелях конфигуратором третьего кодесиса, но выяснилось, что менять эту конфигурацию потом очень трудно, да и опрос равномерный организовать не получается. Куда проще оказалось сделать чтение всех регистров разом в массив и разбивать их потом вручную.

Команды передаются через четыре регистра: код команды, аргумент А, аргумент Б, контрольная сумма (не используется). Например, когда оператор открывает клапан №1, панель однократно записывает код = 4, аргумент А = 1. Контроллер в очередном цикле натыкается на код 4, открывает клапан 1 и выставляет код 0, чтобы команда больше не выполнялась. Для передачи сразу нескольких команд (конфигурирование и пуск автоматического режима, например) в панелях предусмотрен конвейер на 51 команду (хм, нафига так много?).

spk110plc110.png