Страница 755 из 1041 ПерваяПервая ... 255655705745753754755756757765805855 ... ПоследняяПоследняя
Показано с 7,541 по 7,550 из 10404

Тема: ВОПРОС-ОТВЕТ (отвечаем на простые вопросы от новичков)

  1. #7541
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,318

    По умолчанию

    Чего там делаете не видно. У меня ругаецца что файл поврежден

    1.Пришлите в ПЛК из ноута счетчик миллисекунд из винды.
    2.В момент получения в ПЛК запомните разницу между этим значением и TIME()
    3.Через через час-два пришлите в ПЛК еще раз это счетчик.
    4.Покажите разницу между второй посылкой и TIME() за вычетом разницы из п.2. Это и есть расхождение.

  2. #7542

    По умолчанию

    Здравствуйте! Вопрос по modbus.lib
    Код:
    var
    ...
    set_modbus:MB_WR_COILS;
    end_var

    set_modbus(
    Enable:= TRUE,
    Mode:= MB_RTU,
    DevAddr:= Dev_adr,
    firstaddr := 0,
    quantity:=8,
    buffer := buf,
    ComHandle:= ,
    TimeOut:= ,
    Complete=> ,
    Exception=> );
    Данный код без проблем записывает значения в дискретные выходы. (1-8)
    При этом
    var
    ...
    set_modbus:MB_RD_INPUTS; (*MB_RD_COILS тоже*)
    end_var

    set_modbus(
    Enable:= TRUE,
    Mode:= MB_RTU,
    DevAddr:= Dev_adr,
    firstaddr := 0,
    quantity:=8,
    buffer := buf,
    ComHandle:= ,
    TimeOut:= ,
    Complete=> ,
    Exception=> );[/QUOTE]
    не считывает данные из дискретных входов (10001 - 10008)
    Что я делаю неправильно?
    Вложение 46978
    OPC-сервер без проблем читает.

  3. #7543

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Чего там делаете не видно. У меня ругаецца что файл поврежден

    Странно, скачал файл на работе, у меня всё открылось, у меня Кодесис 2.3.9.41 (rus ).

    Сегодня всё проверил по новой, на работе на компе, в эмуляции разброса между ФБ нет, считают одинаково, а вот расхождение с реальным временем на компе
    составило 1 сек. за 1 час, файл прилагаю, там справа выведены часы реальные. Начало проверки в 13ч- 15м - 00с , конец 14-15-01, с каждого ФБ по 2 выхода, с первого булевый и DWORD без миллисекунд, со второго DWORD с миллисекундами и TIME и 4 рассчёта времени.

    Далее ещё раз проверил оба ФБ в железе, оба показывают +11 сек. за час, то есть получается ко времени каждый раз добавляется время цикла.

  4. #7544
    Пользователь
    Регистрация
    02.12.2018
    Адрес
    Россия Донецк
    Сообщений
    8

    По умолчанию

    Не нашел ответ в описании.
    Скажите гуру, как в окне PLC_PRG(PRG- ST) искать начало IF или его окончание END_IF. Проект только начал, количество строк растет. Например в СИ редакторах скобка "{" и ее пара "}" всегда выделялись при наведении на них. Тут не как это не могу, как выделить пару- IF и её END_IF.

  5. #7545

    По умолчанию

    Никак, IDE слишком старое.
    Только структурированными отступами.

  6. #7546
    Пользователь
    Регистрация
    02.12.2018
    Адрес
    Россия Донецк
    Сообщений
    8

    По умолчанию

    спасибо. я так и думал. Но надеялся...

  7. #7547

    Question

    Всем привет! Подскажите, пожалуйста, а как можно внутри ST блока сбросить переменную с типом какой-нибудь структуры в её исходное состояние?
    Например, у меня есть переменна, которая определена так:
    VAR
    QUERY: typModbusExtendedQuery;
    END_VAR
    Сам тип определён так:
    TYPE typModbusExtendedQuery :
    STRUCT
    SlaveAddress : BYTE;
    FunctionCode : BYTE;

    Read_StartAddress : UINT;
    Read_Quantity : UINT;

    Write_StartAddress : UINT;
    Write_Quantity : UINT;
    Write_Data : ARRAY[0..124] OF WORD;
    END_STRUCT
    END_TYPE

    В начальный момент работы POU значения атрибутов этой переменной равны нулям. Далее, по ходу выполнения кода, значения этих атрибутов меняются, и в какой-то момент появляется необходимость получить эту переменную в определённом состоянии: иметь явно заданные SlaveAddress, FunctionCode, Read_StartAddress и Read_Quantity, но при этом иметь гарантированно сброшенные в ноль остальные атрибуты, в т.ч. обнулить массив Write_Data.
    Вопрос: есть ли способ как-то переинициализировать эту переменную, чтобы затем задать только нужные атрибуты?
    Я пробовал делать так:
    QUERY := typModbusExtendedQuery;
    и так
    QUERY := typModbusExtendedQuery();
    и даже так
    QUERY := typModbusExtendedQuery(SlaveAddress=1);
    но ни одна из этих конструкций не сработала, а гугл молчит как партизан. В качестве костыльного решения мне в голову приходит написание отдельной функции, которая будет затирать эту переменную, но может это всё-таки я дурак и есть проще способы? Просто мне в нескольких местах в коде нужно быть уверенным, что я получаю переменную только с явно заданными мною атрибутами, и что в других атрибутах не осталось мусора из других кусков кода.

    Буду признателен за помощь!
    P.S. Только не предлагайте забить на ненулевые значения атрибутов, которые в данном конкретном случае можно оставить в "грязном виде", это всего лишь одна из множества ситуаций и хочется выработать универсальное решение.

  8. #7548

    По умолчанию

    Я так понял, задачу обнуления напрямую такой подход не решает, но позволяет внутри блока реализовать "самоочистку" при дёргании определённого входа. Подход интересный, пожалуй воспользуюсь им там, где возможно. Но метод не универсален, в частности - мне нужно обнулять переменную, которая является именно структурой, т.к. используется она в готовой библиотеке для которой недоступны исходные коды. Т.е. вопрос по прежнему актуален.
    Добавлено: не сразу заметил, что экран ещё вниз скроллится, но о сути догадался

    Придумал ещё два возможных способа обхода:
    1) сделать функцию, которая будет возвращать созданный внутри неё пустой инстанс нужного типа;
    2) сделать функцию, которая будет возвращать созданный внутри неё инстанс нужного типа, наполненный исходя из параметров, переданных функции. Проверил такой вариант на практике - нужно в явном виде тогда все параметры в функцию передавать. Или использовать вместо функции функциональный блок. Оба варианта мне как-то не особо нравятся.

    Но вообще меня не покидает ощущение того, что это должно делаться как-то проще.

  9. #7549

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Какими ФБ ?
    С самого начала я писал про 2 примера, создал по ним два ФБ, их и сравнивал, на данный момент остановился на втором ФБ, его удобней останавливать, сбрасывать и запускать.

    Цитата Сообщение от Валенок Посмотреть сообщение
    Выложите еще раз и прям в pro ?
    Выложил файл для проверки в pro, но это не то что я проверяю в железе. Там вставляю второй ФБ (Vremia_iz_PLC_2) в свой проект и уже всё вместе проверяю.


    Цитата Сообщение от Валенок Посмотреть сообщение
    Я тоже проверил на железе. Расхождение TIME() и виндового счетчика мсек за час у меня около 240мс. У вас 11000мс. Я не говорю что расхождений нет. Я понимаю - разное железо и т.п. Но разница - 2 порядка. Моя метода приведена выше (п#7569).
    У меня ПЛК 154АМ, в работе он нагревается до 45 град С, уже + к погрешности. У вас возможно 110 или 160.
    вы проверяете только 1 ФБ, я целый проект со вставленным ФБ,
    у меня в проекте около 12 REAL, постоянно отслеживается + возможно проект написан далеко не оптимально. Проект хотел вам отправить, но в личку нельзя, а выкладывать сюда не могу, по некоторым соображениям. Если только на мыло.
    Из этого в сумме наверно и набегает 11 секунд.

    Цитата Сообщение от Валенок Посмотреть сообщение
    А к чему упоминаете эмуляцию - вообще не понимаю, у вас расхождение между виндой и эмуляцией кдс ?
    Где вы берёте виндовый счетчик мсек, я так и не понял, но на второй картинке видно, что разница между часами винды и мсек в программе не 1 с, а 262 мсек. Поэтому про эмуляцию давайте забудем.


    Цитата Сообщение от Валенок Посмотреть сообщение
    PS
    При всем уважении, арифметика в квадратиках - это мазохизм
    Ну тут как могу, чтобы быстрее, на ST это займёт у меня на данный момент раз в 100 больше времени.

  10. #7550
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,225

    По умолчанию

    Цитата Сообщение от bashlakov Посмотреть сообщение
    Я так понял, задачу обнуления напрямую такой подход не решает, но позволяет внутри блока реализовать "самоочистку" при дёргании определённого входа. Подход интересный, пожалуй воспользуюсь им там, где возможно. Но метод не универсален, в частности - мне нужно обнулять переменную, которая является именно структурой, т.к. используется она в готовой библиотеке для которой недоступны исходные коды. Т.е. вопрос по прежнему актуален.
    Добавлено: не сразу заметил, что экран ещё вниз скроллится, но о сути догадался

    Придумал ещё два возможных способа обхода:
    1) сделать функцию, которая будет возвращать созданный внутри неё пустой инстанс нужного типа;
    2) сделать функцию, которая будет возвращать созданный внутри неё инстанс нужного типа, наполненный исходя из параметров, переданных функции. Проверил такой вариант на практике - нужно в явном виде тогда все параметры в функцию передавать. Или использовать вместо функции функциональный блок. Оба варианта мне как-то не особо нравятся.

    Но вообще меня не покидает ощущение того, что это должно делаться как-то проще.
    какие функции, просто в окне обяъвлений создаете VAR CONSTANT, там вставляете QUERY_CONST: typModbusExtendedQuery;
    (со всеми нужными значениями)
    и в коде, в нужный момент времени QUERY := QUERY_CONST
    так как раз Валенок практиковал и предлагал ранее здесь на форуме

    ЗЫ ну он собственно про это уже написал
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

Страница 755 из 1041 ПерваяПервая ... 255655705745753754755756757765805855 ... ПоследняяПоследняя

Метки этой темы

Ваши права

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