Showing posts with label issue. Show all posts
Showing posts with label issue. Show all posts

August 23, 2018

Очень длинный кейс

В продолжение темы экономии на абстракциях, я заметил необычное поведение отладчика TwinCAT 2 при пошаговом прохождении оператора CASE.

Программист, используя оператор CASE, заменяет спагетти из "ифов" (IF's) на красивую таблицу из структурированных блоков кода. Выполнение этих блоков зависит от значения одной единственной переменной. Именно так мы строим машину состояний, конечный автомат или просто разбиваем большой код на небольшие куски кода.

Мы ожидаем, что при входе в кейс, будет прочитано значение переменной, затем будет выполнен шаг с номером, хранящимся в этой переменной. Под дебагером же происходит нечто странное: происходит вход в кейс, а затем отладчик проходит по каждому шагу кейса, пока не дойдет до заданного шага и здесь, ожидаемо, начнет выполнять блок кода. Остальные участки кода он слава богу игнорирует, в том числе и те, что лежат условно "ниже" текущего шага (по тексту программы), но что если у нас кейс состоит из 1000 шагов? А то, что он проскачет по всем шагам, пока не достигнет нужного, и мы уже видели, что даже пустые вызовы подпрограмм, налагают дополнительную нагрузку на процессор ПЛК. Это поведение стоит проверить.

(* Я вынес анимированные иллюстрации в конец поста, чтобы не мелькали перед глазами. *)

Так как замерять производительность нужно на большом количестве вызовов и написать пару тысяч строк мне сложно и просто лень, да и времени на это жалко — я накидал программу на C#, которая генерирует другую программу, но уже на ST. Остается только скопировать из сгенерированного текстового файла output.txt код ST-программы, а затем вставить его в проект.

using System.IO;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var writer = new StreamWriter("output.txt")) {
                writer.WriteLine("CASE i OF");

                for(int i = 0; i < 65000; i++)
                    writer.WriteLine($"{i}: c := c + 1;");

                writer.WriteLine("END_CASE");
            }
        }
    }
}


Выводы

  1. Количество шагов оператора CASE никак не влияют на производительность. Во время выполнения программы, при входе в оператор CASE, управление сразу же передают в текущий шаг кейса. Никаких посторонних прыжков не происходит. Это исключительно заморочки режима отладки, причем, только в TwinCAT 2.
  2. Не надо писать гигантские кейсы из 100500 шагов — отладчик падает, а проект собирается два часа.
  3. В TwinCAT 3 все нормально и с отладкой, и с производительность. Отладчик непосредственно переходит к исполняемому в данный момент шагу, игнорируя остальные блоки. Но отладчик все равно не переваривает 100500 шагов кейса и падает.
  4. Удобство языка программирования ST в его текстовости и в том, что вы можете генерировать его программы с помощью других языков программирования: C#, VB, Python, JS, ... автоматизируя рутинные действия. Похожий прием я использовал в проекте Tc3_PcSpeaker для работы со звуковой-пищалкой x86 контроллеров. Только программа была написана на питоне. 

TwinCAT 2




TwinCAT 3



June 5, 2018

Новый билд без ошибок совместимости

Новость недельной давности — Бекхофф выложил новый билд TwinCAT 3.1.4022.20 в котором закрыта ошибка запуска локального рантайма.

Во время установки новой версии, могу посоветовать поставить галку Activate TC Settings. С ним изменится раскладка панелей в Visual Studio (возможно, вам это не понравится), без него — придется ковыряться в дебрях Visual Studio в поисках всех этих кнопок и панелей TwinCAT и вытаскивать их вручную (возможно, это вам не понравится).



После установки нового билда под Windows 10 Home 1803, TwinCAT у меня, несмотря на включенную опцию автостарта сервиса, так и не запустился. Пришлось вручную открыть "Службы" Windows и запустить TcSysSrv (TwinCAT3 System Service). После этого все отлично заработало.

May 25, 2018

Compatibility error Windows 10 v1803

Suddenly, TwinCAT 3.1.4022.16 have got an error of compatibility with the latest update of Windows 10 version 1803. Local runtime of TwinCAT x64 drops down with exception after an attempt to switch into the run mode.


This error occurs both in Home and in Pro versions of Windows 10. The engineering version of the TwinCAT tools still work properly. We are waiting for a new update of TwinCAT.

Ошибка совместимости Windows 10 версии 1803

Свежее обновление Windows 10 до версии 1803 не совместимо с локальным 64-разрядным рантаймом TwinCAT 3.1.4022.16 (или наоборот - TwinCAT не совместим с обновлением Windows).

Тем не менее, после обновления Windows не получится сделать контроллер из локального ПК разработчика: при активации конфигурации с переходом в рабочий режим, рантайм падает с ошибкой и не запускается. Ошибка проявляется на 64-х разрядных версиях Windows 10 как в Home, так и Pro версиях.


Инженерные функции по прежнему работают отлично, можно спокойно конфигурировать и программировать отдельно стоящие контроллеры. Ждем очередного обновления TwinCAT 3.1.