ПЛК100 опрашивает датчики,как мастер.СПК207 опрашивает его уже как слейв. Какой регистр надо считать у ПЛК100 и какой командой?
ПЛК100 опрашивает датчики,как мастер.СПК207 опрашивает его уже как слейв. Какой регистр надо считать у ПЛК100 и какой командой?
Разобрался и с этим вопросом по аналогии с панелью ИП320. Интересно, а возможен такой случай, чтобы не использовать промежуточные переменные, а передавать данные напрямую от датчика к ведущему контроллеру СПК207 ?
У вас два интерфейса с абстрагированием в регистры по разным адресам оперативной памяти. Как минимум копировать регистры модулей в регистры для СПК всё равно придётся.
Мир сговорился :-) Вчера один клиент 3 часа мне доказывал что простой проброс рулит. Его даже не смущало что у него 2 мастера получается на шине. Если вам необходимо много данных прокинуть через ПЛК100 то просто посмотрите в сторону указателей (POINTER) и жизнь станет легче.
Ну да! Я тоже предполагал, что дело с адресным пространством в памяти. Работа с указателями классная идея, но неее
Я вот тут про массивы в ST пытался осилить, но чего-то Help мне не помощь!!! В СИ я себе представляю, а вот тут не очень.
Тут сильно не рекомендуют пользоваться указателямиЕсли вам необходимо много данных прокинуть через ПЛК100 то просто посмотрите в сторону указателей (POINTER) и жизнь станет легче.
http://www.owen.ru/forum/showthread....l=1#post153876
Указателями и на СИ многие не рекомендуют пользоваться.Ибо лезешь в святая святых-память!!!
Ну и с динамическими массивами, тоже проблемки по неосторожности. Если код правильный, то бояться не надо. Облегчает жизнь железу.
Вздор. Си без указателей это не Си. Вот в кодесисе — другой вопрос, т.к. в стандарте 61131 про указатели ни слова, и они являются расширением. К сожалению, реализованы довольно криво: 1) оператор присваивания (функция ADR) игнорирует тип операнда, хотя оператор разыменования (^) тип сохраняет; 2) роняют 110-е ПЛК при доступе к участку памяти, который используется функцией SysComRead (мистика, т.к. семантически равнозначный доступ через SysMemCpy работает).Указателями и на СИ многие не рекомендуют пользоваться.
А можно про п.2 поподробнее если не в тягость
Ну вот недавно библиотеку выкладывал: http://owen.ru/forum/showthread.php?t=19435
Так не получается:
Забавно вот что: 1) если строку закомментировать, то в кодесисе можно наблюдать правильное значение под указателем (зависает именно на разыменовании); 2) если убрать SysComRead и забивать rcvBuf какой-нибудь ерундой вручную, то указатель тоже нормально разыменовывается.Код:i := i + SysComRead(portHandle, ADR(rcvBuf) + i, rcvBuf[10] - i + 11 + 3, 0); (* ... *) ptrToReal := ADR(rcvBuf) + 14; someRealVar := ptrToReal^; (* Именно на этой строке контроллер виснет и перезагружается — даже отладчиком триста раз прошёлся *)
А вот так работает сразу без проблем:Я с этим уже сталкивался пару лет назад в похожем случае, но тогда не упомянул об этой проблеме, т.к. библиотеку выложил увидев значение под указателем в кодесисе, а разыменования в примере нет. Когда проблема всплыла чуть позже при интеграции библиотеки в реальный проект, я забыл обновить тему.Код:i := i + SysComRead(portHandle, ADR(rcvBuf) + i, rcvBuf[10] - i + 11 + 3, 0); (* ... *) SysMemCpy(ADR(someRealVar ), ADR(rcvBuf) + 14, SIZEOF(someRealVar));
В первом случае речь о ПЛК110-32 2013 г., а во втором — о ПЛК160 2011 г.
Последний раз редактировалось Yegor; 03.12.2014 в 20:06.