Страница 22 из 25 ПерваяПервая ... 122021222324 ... ПоследняяПоследняя
Показано с 211 по 220 из 248

Тема: драйвер Delphi

  1. #211

    По умолчанию

    Всем здравствуйте!
    Не стал заводить новую тему, спрошу здесь.
    Для связи программы на дельфи с ПЛК110 через Ethernet использую компонент modbustcp. Связь организована следующим образом: в конфигурации ПЛК прописано 6 байт, ПЛК настроен Slave'ом. Программу дельфи сначала попытался строить по такому принципу:
    По таймеру (раз в 100 мс) сначала происходит чтение 2 байт из ПЛК, затем математическая обработка, затем запись 4 байт. Но не получилось так, как хотелось - таймер срабатывал примерно раз в секунду (смотрел по инкременту числа на надписи, который производился в каждой обработке срабатывания). Разнёс процедуры чтения и записи на разные обработки срабатывания и увеличил частоту срабатывания до раз в 75 мс (то есть, в первой процедуре читаем и математически обрабатываем, в следующей записываем) - всё заработало в расчётном режиме, то есть число на надписи инкрементировалось ~13 раз в секунду. Кто-нибудь может предположить, отчего так происходит, что одновременное чтение и запись так сильно тормозят программу? Работать-то оно хорошо теперь работает, но хотелось бы понять причину, да и не люблю в программе лишние костыли.
    Второй вопрос следующий. Какой функцией можно проверить, подключён ли ПЛК к компьютеру по сети, доступен ли для "общения"? Просто хочу по запуску программы запускать некую функцию типа CheckCommunication, и если ПЛК подключён, то сигнализировать об этом опредённым текстом и цветом надписи, иначе выводить сообщение об ошибке. Сейчас же не нашёл ничего подобного. Таймауты компонента пробовал ставить разными (все три), ничего не получилось. При попытке чтения/записи переменных ПЛК, когда он физически не подключен, функция не возвращает 0 (как должно быть, судя по исходникам компонента мастера) по таймауту, а наглухо вешает программу. Другого способа проверить состояние соединения не знаю. Понимаю, что не хватает знаний, но голова уже замылена этим вопросом, возможно решение где-то наверху, а не вижу. Помогите, пожалуйста, советом.
    Встречал где-то здесь (вроде бы в этой теме, или в подобной) упоминание о том, что кто-то использует самописные функции для связи по ModBus TCP. Подобный пример нашёл на просторах интернета, подключил, откомпилировал программу, всё хорошо, ошибок нет, но при попытке чтения/записи программа вылетает с аксесс виолейшен.
    Всё идёт к тому, чтобы разбираться поглубже в modbus tcp и писать свои функции или минимальный компонент. Но не хочется изобретать велосипед, к тому же вдруг это уже есть. Как хорошо сказал АWА1971 - "Давайте делиться наработками!" Свои я уже выкладывал, и выложу то, что получилось на этот раз, если кому-то будет интересно.
    Железяка должна быть такой: нажал кнопку — работает

  2. #212

    По умолчанию

    по первому вопросу: на форуме несколько раз видел настойчивое указание производить запись и чтение по сети в разных циклах плк для стабильного соединения и безошибочной передачи данных;
    по второму: плк же слэйв, следовательно со стороны компа посылаем запрос, если ответ приходит, значит все хорошо, если не приходит - обрабатывать эту ситуацию как потерю связи

  3. #213

    По умолчанию

    Цитата Сообщение от swerder Посмотреть сообщение
    по первому вопросу: на форуме несколько раз видел настойчивое указание производить запись и чтение по сети в разных циклах плк для стабильного соединения и безошибочной передачи данных;
    по второму: плк же слэйв, следовательно со стороны компа посылаем запрос, если ответ приходит, значит все хорошо, если не приходит - обрабатывать эту ситуацию как потерю связи
    1. Странно, вроде много форум читаю, а настойчивого указания, которое вы привели, не встречал, учту на будущее... Но тогда значит, что всё логично и закономерно. Прикольно, мне казалось, математика в моей программе занимает побольше времени, а оказывается, цикл в ПЛК ещё не успевает закончиться... Спасибо, здесь всё ясно, вопрос снят.
    2. Так в том-то и проблема, что любой запрос (чтение входов, байта, запись и т.д.) наглухо вешает программу, если ПЛК физически не подключен, функция не возвращает 0 по таймауту соединения, как должна бы. Понимаю, что это глюк компонента, либо мой (но вот как - ума не приложу). А вы можете привести пример запроса на основе winsock?
    Сейчас попробую из своего найденного примера засунуть функции по работе с modbus в основной unit, сейчас они пытаются вызываться из другого юнита, может что не так подключил...
    Железяка должна быть такой: нажал кнопку — работает

  4. #214

    По умолчанию

    увы, примера нет. действительно, нехорошая ситуация, что функция даже сама по себе не работает нормально, даже без плк.
    этот пример рассматривали?

  5. #215

    По умолчанию

    Цитата Сообщение от swerder Посмотреть сообщение
    этот пример рассматривали?
    Нет, спасибо за ссылку. Посмотрел - для простой связи между ПЛК по сети езернет самое оно, без лишних заморочек в коде. Но в данный момент у меня в проекте используется связь между контроллерами по RS485 (связал бы по ethernet'у, наверное, было бы надёжнее, но там контроллеры установлены на движущихся устройствах, а витая пара, боюсь, не выдержит постоянных сгибов, хоть и не очень крутых - или есть спец. кабели? но это уже вопрос для другой темы), а сетевые переменные с компа прекрасно читаются через модбас тисипи, проблема вот с этой проверкой на отсутствие связи... Ладно, буду дальше искать решение.
    Железяка должна быть такой: нажал кнопку — работает

  6. #216

    По умолчанию

    контроллеры связаны между собой по rs485, а с компом по езернет? или через переходник какой-то?

  7. #217

    По умолчанию

    Цитата Сообщение от swerder Посмотреть сообщение
    контроллеры связаны между собой по rs485, а с компом по езернет?
    Именно так, как процитировано. Между собой будут связаны и в целевом проекте, а связь с компом только для эмуляции реальных входов/выходов (вместо чтения реальных входов и установкой значений на реальных выходах идёт работа с сетевыми переменными, которые читает/пишет комп, на все три ПЛК). В целевом проекте компа не будет.
    Последний раз редактировалось Вова; 20.07.2011 в 08:58.
    Железяка должна быть такой: нажал кнопку — работает

  8. #218

    По умолчанию

    Очень нужна помощь! Подключаюсь к OPC c использованием библиотеки OCSDAAuto.dll из Delphi. По таймеру раз в секунду проверяется условие
    if OPCServerV20.ServerState <> 1 then OPCServerV20.Connect('CoDeSys.OPC.02',OPCServerV20 .ServerNode). При этом если контроллер не подключен, то программа зависает. Посоветуйте пожалуйста как это исправить ...

  9. #219

    По умолчанию

    if OPCServerV20.ServerState <> 1 then OPCServerV20.Connect('CoDeSys.OPC.02',OPCServerV20 .ServerNode).
    - Запускайте в отдельном потоке и ждите когда сервер даст CONNECT, если не дал за какоето время - убиваем поток.

    Здесь я это сделал для опроса порта
    http://www.owen.ru/forum/showthread.php?t=10668
    Если без отдельных потоков - то при каждом кратковременном пропадении связи, все виснет намертво.
    И не забывайте про паузы в цыклах потоков.

  10. #220

    По умолчанию

    Спасибо! Буду пробовать ...

Страница 22 из 25 ПерваяПервая ... 122021222324 ... ПоследняяПоследняя

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •