Я на недавнем объекте связывал ПЛК110 с двумя СПК110, которые используются чисто как операторский интерфейс.
Обе панели подключаются каждая на свой порт контроллера: одна — на RS-232, другая — на RS-485-2. В конфигураторе контроллера создаётся ветка Modbus (slave), в которую набиваются нужные регистры (они будут нумероваться с нуля) и добавляются оба интерфейса. Панели настраиваются на опрос этих регистров. Обе панели совершенно равнозначны, на них записана одна и та же программа. Схема масштабируется в обе стороны — так же легко можно подключить и одну панель, и десять (было бы столько портов у контроллера) с минимальным копипастом. Задержек (лагов) нет.
Первые четыре модбас-регистра отводятся на передачу команд от панелей контроллеру — эти регистры записываются панелями только когда оператор вызывает команду. Остальные 39 регистров считываются панелями с периодом 33 мс одним скопом. На стороне контроллера эти регистры формируются очень просто:
где SAUnitStatesLo, например, это имя регистра в конфигураторе контроллера (см. скриншот ниже). Аналогичным образом эти WORD'ы потом разбиваются по битам на панелях:Код:SAFlags.2 := PLC_PRG.RegenEnabled; SAUnitStatesLo.0 := heater; SAUnitStatesLo.1 := ik29; SAUnitStatesLo.2 := ik1; SAUnitStatesLo.3 := ik2; SAUnitStatesLo.4 := ik3; ...где kpz — заранее объявленный массив, mbusRaw — заранее объявленный массив с привязкой к каналу чтения регистров. Изначально я пробовал сделать разделение регистров на панелях конфигуратором третьего кодесиса, но выяснилось, что менять эту конфигурацию потом очень трудно, да и опрос равномерный организовать не получается. Куда проще оказалось сделать чтение всех регистров разом в массив и разбивать их потом вручную.Код:(* 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;
Команды передаются через четыре регистра: код команды, аргумент А, аргумент Б, контрольная сумма (не используется). Например, когда оператор открывает клапан №1, панель однократно записывает код = 4, аргумент А = 1. Контроллер в очередном цикле натыкается на код 4, открывает клапан 1 и выставляет код 0, чтобы команда больше не выполнялась. Для передачи сразу нескольких команд (конфигурирование и пуск автоматического режима, например) в панелях предусмотрен конвейер на 51 команду (хм, нафига так много?).
spk110plc110.png


Ответить с цитированием
как долго планируете ждать от меня примера? я в командировке и пока не доберусь до дома больших примеров не сделаю
