Страница 118 из 318 ПерваяПервая ... 1868108116117118119120128168218 ... ПоследняяПоследняя
Показано с 1,171 по 1,180 из 3178

Тема: Панели оператора СП3xx. Вопросы и ответы

  1. #1171
    Пользователь
    Регистрация
    18.05.2017
    Адрес
    Чебоксары
    Сообщений
    118

    По умолчанию

    Цитата Сообщение от Евгений Кислов Посмотреть сообщение
    Конкретный пример - устройство, подключенное к PLC-порту перестало работать:

    1. Панель отправляет запрос и не получает ответ в течение времени PFW38 мс - детектируется отсутствие ответа: PSW72 увеличивается на +1
    2. Панель отправляет повторный запрос
    3. Если на X последовательных запросов (где X = Повторов в настройках порта) нет ответов, то
    • бит PSB51 устанавливается в TRUE на некоторое (зависящее от ряда факторов, в т.ч. таймаута) время
    • PSW71 увеличивается на +1 (сеанс опроса не удался). Фактически, при полном отсутствии связи за все время работы PSW71 = PSW72 / Повторов.
    • в регистр PSW76 записывается адрес устройства, с которым не состоялся сеанс опроса


    После этого начинается следующий сеанс обмена: сброс PSB51, отправка запроса (от следующего элемента / макроса) и так далее.

    Если требуется тщательный контроль обмена - то проще весь обмен перенести в макросы: функции Read(s), Write(s) возвращают соответствующий бит (TRUE - на запрос пришел корректный ответ, FALSE - что-то пошло не так).
    Кроме того, можно будет оптимизировать обмен за счет групповых запросов.
    Евгений, спасибо за подробный ответ с рекомендациями.
    Решение найдено, более удобное чем контроль меандра. .
    В этой связи дополнительный вопрос.
    Насколько понимаю, функции чтения и записи (я их уже использую в макросах) Read(s), Write(s) возвращают значение ошибки в бите.
    Однако, в справке, вызываемой по F1 и в файле руководства пользователя это никак не описано. Если Вас не затруднит, приведите пример использования возвращаемого функциями.
    Со своей стороны, я могу предположить, что надо ставить в условие саму функцию Read(s) или Write(s), по результату устанавливать/сбрасывать бит в незарезервированной области битовой памяти командами SetPSB(n)/ResetPSB(n) либо выполнить необходимые по задаче действия.

    if (Read(......))
    {
    SetPSB(n); //пришел корректный ответ
    ...
    }
    else
    {
    ResetPSB(n); //нет корректного ответа либо нет вообще никакого ответа
    }

    if (Read(......))
    {
    ....; //пришел корректный ответ
    ...
    }
    else
    {
    ....; //нет корректного ответа либо нет вообще никакого ответа
    }
    Последний раз редактировалось Евгений Кислов; 22.11.2018 в 07:11.

  2. #1172
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,066

    По умолчанию

    Абстрактный пример: если чтение удалось, то пишем в выбранный нами регистр статуса 10. Если не удалось - то 20.

    Код:
    BOOL IsSuccessReading;
    WORD Value;
    
    IsSuccessReading = Read(PLC, 1, MODBUS_RTU_REG_4X, 0, 0, TYPE_WORD, &Value);
    
    PSW[256] = Value;
    
    if (IsSuccessReading)
    {
    	Write(HMI_LOCAL_MCH, 0, TYPE_PFW, 300, 0, TYPE_WORD, 10);
    }    
    else
    {
     	Write(HMI_LOCAL_MCH, 0, TYPE_PFW, 300, 0, TYPE_WORD, 20);   
    }
    Однако, в справке, вызываемой по F1 и в файле руководства пользователя это никак не описано.
    Актуальная версия в pdf (доступно на сайте и диске из комплекта поставки).

  3. #1173
    Пользователь
    Регистрация
    18.05.2017
    Адрес
    Чебоксары
    Сообщений
    118

    По умолчанию

    Цитата Сообщение от Евгений Кислов Посмотреть сообщение
    Абстрактный пример: если чтение удалось, то пишем в выбранный нами регистр статуса 10. Если не удалось - то 20.

    Код:
    BOOL IsSuccessReading;
    WORD Value;
    
    IsSuccessReading = Read(PLC, 1, MODBUS_RTU_REG_4X, 0, 0, TYPE_WORD, &Value);
    
    PSW[256] = Value;
    
    if (IsSuccessReading)
    {
    	Write(HMI_LOCAL_MCH, 0, TYPE_PFW, 300, 0, TYPE_WORD, 10);
    }    
    else
    {
     	Write(HMI_LOCAL_MCH, 0, TYPE_PFW, 300, 0, TYPE_WORD, 20);   
    }


    Актуальная версия в pdf (доступно на сайте и диске из комплекта поставки).
    Спасибо, вопросов больше нет.

  4. #1174
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,825

    По умолчанию

    Цитата Сообщение от Евгений76 Посмотреть сообщение
    В тему управления обменом с устройствами.
    бит PFW 130. Необходимо откл обмен с устройствами. Переключатель , в нем настройки PFW 316.1 при вкл откл-ся связь при выкл включается? адрес устройства 1,( пробовал- ничего не происходит). читал несколько раз РП на последней странице...как то мудрено
    Вы наверно читали, что-то не то
    В регистр PFW130 нужно не биты записывать, а базовый адрес регистров PFW, через биты которых и происходит управление обменом.
    Например
    Имеется шесть ПЛК с адресами станций 2, 4, 6, 8, 10, 12. Контроллеры подключены к порту PLC.
    Выберем для области управления регистры PFW с адреса, например, 400.
    С помощью ф.области (ГЛОБАЛЬНОЙ) с условием "После загрузки проекта" запишем в регистр PFW130 значение 400 как Dword.
    Для порта PLC адрес регистра управления будет БАЗОВЫЙ адрес + 16, т.е 400 + 16 =416
    Теперь битами регистра PFW416 можно выводить отключенные контроллеры из обмена.
    PFW416.02 - ПЛК с адресом 2;
    PFW416.04 - ПЛК с адресом 4;
    PFW416.06 - ПЛК с адресом 6;
    PFW416.08 - ПЛК с адресом 8;
    PFW416.10 - ПЛК с адресом 10;
    PFW416.12 - ПЛК с адресом 12;
    Последний раз редактировалось petera; 21.11.2018 в 10:22.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  5. #1175

    По умолчанию

    Евгений,
    petera спасибо получилось отключить обмен

  6. #1176
    Пользователь
    Регистрация
    18.05.2017
    Адрес
    Чебоксары
    Сообщений
    118

    По умолчанию

    Цитата Сообщение от Евгений Кислов Посмотреть сообщение
    Абстрактный пример: если чтение удалось, то пишем в выбранный нами регистр статуса 10. Если не удалось - то 20.
    Актуальная версия в pdf (доступно на сайте и диске из комплекта поставки).
    Вот и появились сомнения в поддержке старых проектов - это так, к слову.

    Итак, весь обмен перевел в макросы, кроме экранных кнопок, подающих команды

    Евгений, нужно уточнение по тайм-ауту обмена.
    Тайм-аут я понимаю как время, за которое должно ответить устройство. Если устройство не ответило, то
    СП307-Р в функциях чтения-записи возвращает 0, если ответило - 1.
    Теперь о сомнениях.
    После дня упорных экспериментов с макросами, вызов которых выполняется через функциональную область, в проекте указзаную как глобальная,
    мне не удалось установить достоверное время тайм-аута.
    Попробовал, скачав последнее РП, разобраться.
    Указано, что PFW35 содержит тайм-аут в миллисекундах. Читаю его, вывожу на экран - и вижу не тайм-аут, в конфигураторе недоступный для настройки, а параметр "Задержка отправки" в настройках порта PLС. Меняю параметр, загружаю проект - вижу, что не ошибся, PFW35 содержит измененное мной значение.
    Как настроить тайм аут, доступна ли эта настройка, или надо рассчитывать на какой-то фиксированный тайм-аут?
    Может быть Вы под тайм-аутом имеете нечто иное, чем я описал выше?
    Последний раз редактировалось konst_smn; 21.11.2018 в 15:56.

  7. #1177
    Пользователь
    Регистрация
    18.05.2017
    Адрес
    Чебоксары
    Сообщений
    118

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    PFW28 -тайм-аут для порта Download
    PFW38 -тайм-аут для порта PLC
    По умолчанию там записано значение 1000(мс)
    Спасибо за пояснения!
    Но у меня опять вопрос .
    Могу ли я в моем макросе инициализации, вызываемом при загрузке проекта однократно, изменить это значение (естественно,
    понимая что могу и увеличить динамику обмена, и, если есть медленно отвечающие устройства, не дождаться ответа от ведомых устройств).
    Ведомые устройства в данном проекте - это ПЧ ESQ600 и ПР200, по 2 штуки, отвечают довольно шустро, думаю что 100 мс для них будет достаточно.

  8. #1178
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,825

    По умолчанию

    Цитата Сообщение от konst_smn Посмотреть сообщение
    Спасибо за пояснения!
    Но у меня опять вопрос .
    Могу ли я в моем макросе инициализации, вызываемом при загрузке проекта однократно, изменить это значение (естественно,
    понимая что могу и увеличить динамику обмена, и, если есть медленно отвечающие устройства, не дождаться ответа от ведомых устройств).
    Ведомые устройства в данном проекте - это ПЧ ESQ600 и ПР200, по 2 штуки, отвечают довольно шустро, думаю что 100 мс для них будет достаточно.
    Ну так попробуйте свой макрос инициализации на пустом проекте. Дисплей с регистромPFW38 Вам в помощь.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  9. #1179
    Пользователь
    Регистрация
    18.05.2017
    Адрес
    Чебоксары
    Сообщений
    118

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    Ну так попробуйте свой макрос инициализации на пустом проекте. Дисплей с регистромPFW38 Вам в помощь.
    Извините за назойливость и не подумайте, что я пытаюсь учить разработчика - просто пытаюсь понять, правильно ли работаю.
    Перенес часть кода в глобальный макрос, чтобы вызывать из других макросов. Читаю информацию из области регистров с "разрывами", поэтому два чтения
    Код:
    void Read_AC_DR(WORD AddrDev, WORD AddrBufPSW) 
    {
        WORD value;
        WORD arrvalue[4];
        BOOL rez;
        
        // Info from AC Drive 	
        rez = Reads(PLC, AddrDev, MODBUS_RTU_REGS_4X, 41473, 5, &arrvalue);
        if(rez)
        {
    		PSW[AddrBufPSW] = arrvalue[0];
    		PSW[AddrBufPSW + 1] = arrvalue[3];
    		PSW[AddrBufPSW + 2] = arrvalue[4];
        }    
        
    	rez = Read(PLC, AddrDev, MODBUS_RTU_REG_4X, 41496, 0, TYPE_WORD, &value);
        if(rez)
    	{
    		PSW[AddrBufPSW + 3] = value;
        }    
    }
    Вопросs
    1) Надо ли перестраховываться с контролем результата обмена в Reads? У меня проект работает в реальной панели, ведомых устройств физически нет, и сложилось впечатление, ч то в регистры попадает какой-то мусор. Ну тоесть, если чтение прошло с ошибкой, или стработал тайм-аут (у меня он срабатывает), то в arrvalue ничего не записывается? Режим исполнения макроса, где вызывается данная подпрограмма - циклический, 1 секунда, "параллельно".
    2) Правильно ли использование value? Так дается в примерах по всему руководству, но, опять же не пытаясь учить, и понимая, что у вас Си-подобный синтаксис языка, пытаюсь снять свои сомнения. Ну мало ли, опечатка какая вкралась... Люди же используют в тысячах проектов, а я тут умный такой выискался .
    WORD arrvalue[5];
    если бы я пытался взять адрес первого элемента этого массива в Си - я использовал бы не &arrvalue, а просто arrvalue без амперсенда. У Вас адрес берется не так, как в Си?
    Не воспримите как упрек, я понимаю, что могу ошибаться, и что у Вас свой собственный язык, ну просто когда на разных языках, подобных, пишешь, надо избежать ошибок (это я про себя ).
    PS Возможно, "мусор" в arrvalue - это результат использования локального массива без инициализации, и даже скорее всего именно из-за этого. Как я понял, глобальные переменные в глобальном макросе инициализируются нулем, если нет явной их инициализации, а локальные никак не инициализируются по умолчанию?
    Последний раз редактировалось konst_smn; 22.11.2018 в 11:21.

  10. #1180
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,825

    По умолчанию

    Цитата Сообщение от konst_smn Посмотреть сообщение
    Извините за назойливость и не подумайте, что я пытаюсь учить разработчика - просто пытаюсь понять, правильно ли работаю.
    Перенес часть кода в глобальный макрос, чтобы вызывать из других макросов. Читаю информацию из области регистров с "разрывами", поэтому два чтения
    Код:
    void Read_AC_DR(WORD AddrDev, WORD AddrBufPSW) 
    {
        WORD value;
        WORD arrvalue[4];
        BOOL rez;
        
        // Info from AC Drive 	
        rez = Reads(PLC, AddrDev, MODBUS_RTU_REGS_4X, 41473, 5, &arrvalue);
        if(rez)
        {
    		PSW[AddrBufPSW] = arrvalue[0];
    		PSW[AddrBufPSW + 1] = arrvalue[3];
    		PSW[AddrBufPSW + 2] = arrvalue[4];
        }    
        
    	rez = Read(PLC, AddrDev, MODBUS_RTU_REG_4X, 41496, 0, TYPE_WORD, &value);
        if(rez)
    	{
    		PSW[AddrBufPSW + 3] = value;
        }    
    }
    Вопросs
    1) Надо ли перестраховываться с контролем результата обмена в Reads? У меня проект работает в реальной панели, ведомых устройств физически нет, и сложилось впечатление, ч то в регистры попадает какой-то мусор. Ну тоесть, если чтение прошло с ошибкой, или стработал тайм-аут (у меня он срабатывает), то в arrvalue ничего не записывается? Режим исполнения макроса, где вызывается данная подпрограмма - циклический, 1 секунда, "параллельно".
    2) Правильно ли использование value? Так дается в примерах по всему руководству, но, опять же не пытаясь учить, и понимая, что у вас Си-подобный синтаксис языка, пытаюсь снять свои сомнения. Ну мало ли, опечатка какая вкралась... Люди же используют в тысячах проектов, а я тут умный такой выискался .
    WORD arrvalue[5];
    если бы я пытался взять адрес первого элемента этого массива в Си - я использовал бы не &arrvalue, а просто arrvalue без амперсенда. У Вас адрес берется не так, как в Си?
    Не воспримите как упрек, я понимаю, что могу ошибаться, и что у Вас свой собственный язык, ну просто когда на разных языках, подобных, пишешь, надо избежать ошибок (это я про себя ).
    PS Возможно, "мусор" в arrvalue - это результат использования локального массива без инициализации, и даже скорее всего именно из-за этого. Как я понял, глобальные переменные в глобальном макросе инициализируются нулем, если нет явной их инициализации, а локальные никак не инициализируются по умолчанию?
    Я простой смертный
    И в макросах Си не шибко силен. Нужно подождать, что на это ответит Евгений Кислов.
    если бы я пытался взять адрес первого элемента этого массива в Си - я использовал бы не &arrvalue, а просто arrvalue без амперсенда
    Все верно, можете так и делать. Но кашу маслом не испортить?
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

Страница 118 из 318 ПерваяПервая ... 1868108116117118119120128168218 ... ПоследняяПоследняя

Похожие темы

  1. Экспорт CSV в панели СП3xx и порядок квитирования событий
    от theoretician в разделе Панели оператора (HMI)
    Ответов: 30
    Последнее сообщение: 24.08.2021, 16:17
  2. Индикатор ИП120 , вопросы- ответы
    от rovki в разделе Программируемые реле
    Ответов: 56
    Последнее сообщение: 03.11.2017, 15:58
  3. Сенсорные панели оператора ОВЕН СП3ХХ
    от Боднар Олег Миколайович в разделе Подбор Оборудования
    Ответов: 7
    Последнее сообщение: 17.12.2015, 09:09
  4. СПК 107 в качестве панели оператора
    от Леонид в разделе СПК1хх
    Ответов: 15
    Последнее сообщение: 20.11.2015, 08:17

Ваши права

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