Цитата(Alex_Doctor @ 18.12.2011, 7:42)

Есть 4 контроллера Twido TWDLCAE40DRF. Соединены по ethernet.
TW1 модулей нет
TW2 7 модулей TWDAMI8HT, по 8 аналоговых входов каждый.
TW3 7 модулей TWDAVO2HT, по 2 аналоговых выхода каждый
TW4 1 модуль TWDAVO2HT на 2 аналоговых выхода, 2 модуля TWDAMI8HT по 8 аналоговых входов.
Аналоговые входы - считывание параметров с термодатчиков и датчиков давления(72 параметра), аналоговые выходы - управление задвижки (16 задвижек данфосс).
При работе через OPC сервер все работает как надо. Входы считываются, выходы записываются. Крутится программка, которая через OPC считывает параметры, обрабатывает, пишет на выходы, все хоккей. Однако требуется вынести всю логику на контроллер TW1 и возникла проблема. Всё (на мастер контроллере прописаны IP слейвов, макросы Comm и Symbol заполнены) сделано по букварю (TWIDO S1062 Version A). Однако команды записи C-WRNW и C_WR1W не работают вообще, команды чтения C_RDNW и C_RD1W работают, но только в отношении одного контроллера, первого в тексте программы. Т.е. в программе прописано обращение ко всем контроллерам, а обмен идет только с первым, и только на чтение.
Кто сталкивался с аналогичной проблемой, помогите! Если можно, примерами!
Это распространённая ошибка программирования функций обращений чтения/записи по Modbus для контроллеров Twido. Необходимо пояснить принцип работы контроллера... Контроллер выполняет программу циклически (создание образа состояния входов - обработка логики программы пользователя - создание образа состояния выходов). Время цикла может быть порядка 10 мс. В тоже время, инструкция EXCH запускает процесс связи в коммуникационном модуле. Полная обработка данной процедуры может длиться несколько циклов контроллеров. Каждый раз, когда идёт обработка логики пользовательской команды выполняется первая инструкция EXCH и соответсвующий порт контроллера остаётся занят этой операцией на несколько циклов контроллера. После того как он освободится, опять занимается первой инструкцией EXCH и так далее. До последующих EXCH инструкций он никогда не дойдет. К сожалению, в существующих примерах Шнейдер в качестве инициализации выполнения EXCH инструкции использует логические входа контроллера (по фронту!!!) и нет примеров реальной обработки slave устройств. Можно только получить пример такой программы в техподдержки SE.
EXCH1 - инструкция для порта 1 (порт программирования)
EXCH2 - инструкция для порта 2 (опционный порт)
EXCH3 - инструкция для встроенного Ethernet порта контроллеров компактной 40 серии.
Макросы основаны на инструкциях EXCH, фактически это некая подпрограмма написанная на основе EXCH. Эту программу можно легко посмотреть, щёлкнув правой кнопкой мыши на блоке макроса в теле программы.
Разницы в написании вообщем нет, нужна аккуратность и не более.
Как организовать программу. Один из способов, это организовать в программе циклический перебор выполняемого макроса или EXCH инструкции. Обязательно присутствие бита состояния порта MSGD (вроде). Который собственно и запускает выполнение EXCH инструкции. Если количество slave устройств много, то рекомендую предусмотреть вариант исключения отключившегося slave устройства по таймауту. Это ускорит взаимообмен.
По конкретно задаче. Скорее всего то не подойдет из за ограничений, но стоит напомнить, что в Twido есть возможность организовать взаимообмен между контроллерами в режиме Remote Link. Один из режимов, когда контроллеры равноправные с собственными программами и обмениваются между собой 4 словами на передачу и 4 словами на приём. Можно объеденить до 7 контроллеров на расстоянии до 200 метров.