Чуть конкретней. Без буклетно-рекламных "быстрее-выше-сильней"
?
Вид для печати
Чуть конкретней. Без буклетно-рекламных "быстрее-выше-сильней"
?
Привет! Если чуть конкретней, без букетно-рекламных - Сейчас ведется разработка новой среды программирования ПЛК под названием ALTA IDE.
Среда полностью написанная с нуля, не базируется на Codesys, Беремис и пр. В начале следующего года планируем выпустить бета версию, совместно с выпуском обновленного ПЛК110.
В среде будут поддержаны языки МЭК. В начале будет ST, далее будем добавлять по "популярности" - FBD, CFC, LD и т.д.
То же самое с протоколами комм. Сначала Modbus, далее OPC UA, SNMP, MQTT и пр.
Будем понемногу добавлять в поддержку устройства ОВЕН, это наши ПЛК и старшие модели ПР, хотя так же планируем сотрудничать и с другими производителями ПЛК. Поддержка будет внедрятся по мере развития среды и добавления нового функционала в нее.
Среда заточена под удобство и простоту (извиняюсь за маркетинговый сленг), но мы действительно хотим сделать среду более понятной для пользователей которые еще не такие матерые в АСУ ТП и приблизить удобство пром. программирования к уровню современных редакторов верхнеуровневых ЯП.
А так, надеюсь через небольшое время уже сможем провести презентацию и рассказать чуть более подробно и показать над чем мы работаем уже довольно давно!
на чем реализация среды? язык?
Кроссплатформенность среды ?
C# с Avalonia.
Кроссплатформенность среды - Win, Linux, как популярные самые дистрибутивы так и под ру ОСи тестируем
Интересно... надо будет тестировать... смотрел в строну Avalonia, но какой вообще ужас делать окошки :) даже в WindowsForm не ожидал, что потребуется столько логики писать. А там вообще мрак полный как по мне....
Видел один продукт на Avalonia, не впечатлило... Опять же проблема в том, что пытаетесь все впихнуть в одно общее окно для работы.
Поставьте себе CAD программы для примера как это должно выглядеть, ну хотя бы NanoCAD наш в триал варианте на месяц. Поймите наконец что требуется при работе с интерфейсом. (CAD программы максимально заточены на работу, когда требуется большой холст, слева часть окна Свойства. Все остальное поверх, с возможностью перетягивания на второй монитор, максимум пространства для рабочего пространства).
Не делайте пожалуйста убогое подобие MasterScada, где впихнули все и вся в одно окно....
Ну хотя вам сама VisualStudio прекрасно показывает, как это должно выглядеть тоже.
з.ы. и пожалста, не применяйте ср... json, он требует полного повторения структуры для сериализации, стоит стереть параметр из файла и привет... xml тут гораздо гибче, можно атрибуты в игнор ставить и не писать по чем зря...
когда Вас уже забанят, ежедневный бред несете, свое личное мнение выдаете за общепринятое, что вот за пурга про json и xml, ну для начала изучите документацию, посмотрите примеры, если Вы слабы в программировании то не надо здесь давать советы как программы писать
илиКод:using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System.Reflection;
public class User
{
public string Name { get; set; }
public int Age { get; set; }
public string Email { get; set; }
}
public class CustomContractResolver : DefaultContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);
// Установка значений по умолчанию для всех свойств
if (property.PropertyType == typeof(int))
property.DefaultValue = 10;
else if (property.PropertyType == typeof(string))
property.DefaultValue = "не указано";
// Важно: включаем обработку значений по умолчанию
property.DefaultValueHandling = DefaultValueHandling.Populate;
return property;
}
}
class Program
{
static void Main()
{
var options = new JsonSerializerSettings
{
ContractResolver = new CustomContractResolver(),
ObjectCreationHandling = ObjectCreationHandling.Replace,
NullValueHandling = NullValueHandling.Include
};
string json = @"{ ""Name"": ""Иван"" }";
User user = JsonConvert.DeserializeObject<User>(json, options);
Console.WriteLine($"Имя: {user.Name}"); // выведет: Иван
Console.WriteLine($"Возраст: {user.Age}"); // выведет: 10
Console.WriteLine($"Email: {user.Email}"); // выведет: не указано
}
}
рашают эту задачу так же как парсер xmlКод:using System;
using System.Text.Json;
public class User
{
public string? Name { get; set; }
public int Age { get; set; } //= 25;
public string Email { get; set; } //= "Не указано";
}
class Program
{
static void Main()
{
string json = @"{ ""Name"": ""Иван"" }";
var options = new JsonSerializerOptions
{
IncludeFields = true,
PropertyNameCaseInsensitive = true
};
User user = JsonSerializer.Deserialize<User>(json, options);
Console.WriteLine($"Имя: {user.Name}"); // выведет: Иван
Console.WriteLine($"Возраст: {user.Age}"); // выведет: 0
Console.WriteLine($"Email: {user.Email}"); // выведет: (null)
}
}
Расширенный?Цитата:
В начале будет ST,
при объявлении переменой - вызов функций?
union, property, указатели, adrinst()? эквивалент syslibmem?
ФБ как структуры в КДС2 или как "более объекты" КДС3?
Тип - функция? //для человеческого колбэка?
Самостоятельный доступ к портам? эквиваленты syslibcom, syslibsocket? синхрон/асинхрон?Код:Сначала Modbus, далее OPC UA, SNMP, MQTT и пр
эквивалент syslibfile? синхрон/асинхрон? флеш (ресурс) - тот же?
Прогнозируемое время цикла при проекте из ";"?
Доступ к прерываниям?
Увидеть из проекта первый и особенно(!!) последний выдох проекта перед отключением?
Программное чтение/запись для ip/маска/гейт и т.п...?
Возможность самостоятельных либ на c# ...?Цитата:
C#
Возможность прикрепить к чужому проекту свою уже компилированную либу?
Возможность загрузки компилированного проекта без среды (а-ля "plc_io.exe")?
capzap сохраните файл сериализацией. А потом делаем пасы руками: заходите в файл, удаляете нафик любую переменную (например у вас переменная с пустой строкой занимает место в файле), потом попробуйте десериализовать обратно.
Если у вас получится такое с json, покажите как и я возьму свои слова обратно.
Чтобы было понятнее, вот примитивный пример
Код:<DevTemplate Bus="M4" Address="0" Name="SPT941-20" Descriptor="" readLastErr="false" RemindEvery="true" TimeCode="Time" DateCode="Date">
Во втором примере отсутствует запись Descriptor и readLastErr - xml сериализатор даже не поперхнется от их отсутствия и выдаст пустую строку и false для данных переменных.Код:<DevTemplate Bus="M4" Address="0" Name="SPT941-20" RemindEvery="true" TimeCode="Time" DateCode="Date">
Так что пожалуйста - покажите такой же фокус с json. Мне очень надо и для него то же самое...
На счет json я использовал System.Text.Json а не Newtonsoft.Json (его пробовал ранее, те же, только в профиль)
з.ы. я почему собственно за подобный вариант? - он позволяет организовать структуру так, что при добавлении новых полей продолжать использовать ПО старой версии, если изменения не касались этой старой версии. Некоторая обратная совместимость сохраняется, пока полностью не перелопатишь классы.
Вложение 85285 на сколько это возможно, у меня работает
capzap покажите результирующий файл (txt или во что вы сохраняете?)
Еще раз, вы тестируете код прямо так. Вы в файле удалите переменную и потом десериализуйте. Это первое. А второе, при сериализации в файл если строка null сделайте так, чтобы она просто не записалась в файл. Я не знаю, как еще объяснить этот фокус. Для XML есть такая штука как
[XmlIgnore]
public bool readLastErrSpecified { get { return readLastErr == true; } }
То есть если у нас переменная false - то в файл даже записи не произойдет. Только если она true. И при обратном чтении из файла никто никуда не выпадет в осадок (Исключение)
Я не нашел подобной реализации для json. И если вы посмотрите, сколько записей в файле ОЛ по типу uuid="00000000000000000000000000000" (нули тут от балды) а еще если их все удалите из файла, то поймете, на сколько можно было сократить этот самый файл...
capzap ессно это записано в классе программы. Результирующие строки из xml я привел выше, два варианта и оба рабочих для программы.
И вот с json подобные фокусы не проходят, по крайней мере я не нашел решения, а очень бы хотелось иметь подобное решение в активе при работе с json. А то приходится описывать кучу классов для сериализации, чтобы оно не отваливалось. з.ы. мало того, весь этот мусор еще гуляет по сети, когда опрашиваешь облако Овен, ну нафига передавать тот же false или 0 или пустую строку с именем переменной?
Век быстрого интернета и объемные диски расслабляют людей до невозможности :)
capzap не, просто облако можно прочитать одним запросом :) меньше мусора, меньше период между запросами :)
И ну не забывайте, есть же еще и мобильный интернет, а там как бы другие скорости.
Искренне желаю успехов, и, очень надеюсь, что новая среда не получится такой "деревянной" и баганутой как Лоджик и, при этом, действительно будет иметь низкий порог вхождения
Поверхностное мнение пользователей всегда важно для развития продукта. Пользователи часто замечают то, что не в силах заметить программист. (Правда ему потом работы больше :) )
Ну как примитивный пример, зачем три раза клацать мышью, когда можно сделать за один щелчок другой кнопкой? Утрировано конечно.
По этому мое имхо, даже прототипы по надо выкладывать в тесты раньше, возможно некоторые вещи можно изменить на ранних этапах, когда ПО не закостенело.
Dimensy, я примерно о том же. Сперва напишут "не спрося", а потом добавляют в список доделок, переделок и растягивают во времени. Вместо того, чтобы сделать сразу, как больше удобнее пользователям. Да, сколько людей, столько и мнений, бесспорно, но когда эти мнения есть сразу, можно идти по лучшему пути, ну или по пути, за который "проголосовало" большинство.
C# хороший язык, в Framework-e масса готового, чем и нравится. Но типизация языка иногда просто убивает. Хочешь сделать что-то более гибкое, но тебе тут же бьют по рукам, так низя :) и начинаешь искать пути обхода.
з.ы. проблема не в менеджерах, а в программистах, эти "редиски" пишут по ТЗ, при этом часто далеки от асутп, программировании ПЛК и т.д.
Как кто-то написал, их надо заставлять запускать объекты, на ими же написанном ПО :)
а) в общем списке переменных никак не выделяется, что она энергонезависимая
б) могут быть случаи, когда не требуется хранить параметр в энергонезависимой памяти (т.е., при перезагрузке переменная должна сброситься в ноль)
в) у автоматических энергонезависимых переменных нельзя выставить значение по умолчанию
ну по ответам Владислава, там будут губы, но не для конкретного человека а просто всем. Вроде тема создана не 1-ого апреля, но видимо в Овен как раз эта дата на ближайшее время просматривается :)
стандарт ST будет CoDeSys2.3++
ООП пока не планируем включать, но всё возможно - нет примеров использования
Либ на дотнете не будет (фу какая бяка)
Весь код приложения пользователя на ST
Развитая система библиотек
Переносимость кода меж платформами (за исключением привязок к конкретным I/O, номеров портов и т.п. аппаратно-зависимых вещей)
Симулятор
Отладка
Трассировка (не сразу)
Стандартизированный интерфейс работы с сторонними приложениями (как на ПЛК так и по сети) - для обмена данными
Цикл из ; - ну 10 мкс получится спокойно. Но опять же смысл такого цикла ради красивой цифры? Главное джиттер - тут тесты показывают 100-200 мкс на неопримизированной прошивке.
Прерывания - возможно, но опять же нужны реальные CASE.
Возможность прикрепить к чужому проекту свою уже компилированную либу? - соберёте so - welcome
Возможность загрузки компилированного проекта без среды - да
Программное чтение/запись вообще всего (что разрешим :)
Самостоятельный доступ к портам? эквиваленты syslibcom, syslibsocket? синхрон/асинхрон?
эквивалент syslibfile? синхрон/асинхрон? флеш (ресурс) - в планах, ориентируемся на работу с файлами в Linux, Все уже имеют опыт с ПЛК210 - будет аналогичные библиотеки.
Максимальная переносимость библиотек/проектов с CoDeSyS - насколько возможно.
Тип - функция - да, но мы не дадим гранату пользователям! Сделаем библиотечку-обёртку.
ну, ставить dotnet на ПЛК действительно не разумно. Но - будет вариант просто снести IDE и использовать ПЛК как linux ПК ?
сколько вообще памяти в нем будет ОЗУ ? или это не та железка, чтобы такое провернуть?
Филоненко Владислав я ничего не рекламировал, не передергивайте.
характеристики железки можете написать? сколько памяти, какой проц, использование flash и т.д. и т.п. ?
Про снос среды имел ввиду самостоятельно снести и самостоятельно вернуть обратно? Мало ли, для использования в своих целях самой железки не по назначению, которое вы ей придаете изначально.
Только ньюанс - просилось исключить возможность несанкционированной загрузки пустого ПЛК. В "старых" ПЛК это было лучше сделано. У вас решили что все проблемы это - губы. Вы решили не закрыть канализационный люк, а поставить губообразные дорожные конусы вокруг него.
--
Приехал домой, поужинал и подумал - раз уж губы мои, можно это как-то увековечить надписью на самом ПЛК? Или, на худой конец, в разделе РЭ/РП где описаны манипуляции с этим тублером? (.. пивасика опрокинул ..) и контакт там мой обозначить?
(.. еще ..) Эх! Губы Валенка и Овен - это сила! (Улыбнулся) Чёрт возьми, отличная фраза для какого-нибудь романа ... Надо будет кому-нибудь предложить
--
Убедительная просьба сделать дефолтным достаточное или директиву для компилятора для полного/достаточного вычисления логических выраженийЦитата:
стандарт ST будет CoDeSys2.3++
Возможно ли в ++ (хотя бы по директиве) сделать оператор присвоения еще и функцией с результатом и типом присвоенного?
И вообще что будет/планируется в ++ к КДС2.3?
В этой среде будет возможность написать и скомпилировать либу в отдельный файл который не будет содержать исходника и юзать этот файл в этой среде но в другом проекте?Цитата:
Возможность прикрепить к чужому проекту свою уже компилированную либу? - соберёте so - welcome
Объявление прототипа функции и возможность вызова функции по указателю на прототип без этих оберток?Цитата:
Тип - функция - да, но мы не дадим гранату пользователям! Сделаем библиотечку-обёртку
В чем граната? Граната например - любой указатель. Указатели долой? В кривых руках сам ПЛК - граната. А "подорвавшийся" все равно скажет что это Овен такой.
Можно про смысл решать тому, кому предополагается купить и использовать это оборудование, а не тому кто его продаст 1(один) раз? Вас же просто спрашивают про возможности, а не требуют волшебства.Цитата:
ну 10 мкс получится спокойно. Но опять же смысл такого цикла ради красивой цифры?
Какой-нить циклический счетчик мкс будет?
Приведите хоть список планируемых запретовЦитата:
Программное чтение/запись вообще всего (что разрешим :)
Свои десять копеек в хотелки для новой среды.
Что меня раздражает в КДС:
1. Детекторы фронтов и спадов сигнала. Перед каждым сигналом приходится ставить триггер, его еще приходится описывать в шапке\глобале. Если таких сигналов много, то и писанины получается "Война и мир" на минималках, особенно если только ST. В азиатских средах (Мелсек-подобных) сделано проще - на LD просто несколько вариантов символов "контакта". Как вариант - сделать команды условно RAISE и FAIL. Т. е. IF RAISE(DI1) THEN действие. И всё, без лишних триггеров и описания.
2. Работа с быстрыми входами. Конкретно для ПЛК Овен 110 приходилось использовать нештатные средства для получения желаемого функционала, ибо штатные грусть-тоска-печаль. В других средах видел простое решение - штатный ФБ, работающий с высокоскоростными входами на аппаратном уровне. Например счетчик+тахометр в одном флаконе, причем счетчик энергонезависимый. Вытаскиваю на поляну ФБ, подключаю вход, задание счетчику (если требуется) и сигнал сброса, на выходе имею сразу счет, сигнал достижения счета, и частоту импульсов в имп\сек. Удобно и без лишней пыли.
3. Работа с быстрыми выходами. Хотелось бы видеть "гладкий" ШИМ, без перезапуска периода по факту обновления задания. Так же желательно иметь ФБ для примитивной работы с ШД - на входе скорость, ускорения, команда, сброс координаты, возможность прочтения текущей координаты двигателя. ФБ работает с физическим выходом на аппаратном уровне вне цикла ПЛК.
зачем перед каждым?Цитата:
Перед каждым сигналом приходится ставить триггер
ну это же совсем другая история с математикой потому чтоЦитата:
В других средах видел простое решение - штатный ФБ, работающий с высокоскоростными входами на аппаратном уровне.
и как же ФБ должен существовать вне цикла, который есть суть среды? это должна быть другая среда вообщеЦитата:
ФБ работает с физическим выходом на аппаратном уровне вне цикла ПЛК.
просто мысли вслух
В ПЛК110М2 высокоскоростные входа\выхода физически выполнены на отдельном сопроцессоре. Энтузиастами было разработано нештатное средство, позволяющее программировать этот сопроцессор под свои хотелки. Из основной программы давалось задание, сопроцессор его отрабатывал независимо от основного цикла. Поищите здесь на форуме Hardella IDE для понимания вопроса.Цитата:
как же ФБ должен существовать вне цикла
Возможно я косноязычно выразился, бывает такое у меня.Цитата:
зачем перед каждым?
Для классического ST и LD в КДС:
Вложение 85297
В другой среде это же действие организовано проще:
Вложение 85298
Ну стрелочка вверх это тот же R-Trig на самом деле. Проще или нет, просто вот так. Вряд ли кто-то будет делать так же, как у других. Хотя да, часто проще и импульс и инвертирование сделать прямо на блоке. Но при этом не отказываться от обычной реализации... Попробуйте в другой среде одновременно и F-триг и инвертирование поставить на входе, просто не получится.
Я рассуждаю с точки зрения простоты выполнения задачи. Мне реально проще нарисовать стрелочку в нужную сторону, чем набирать стопицот букв. Вот и предлагаю вместо объявления триггера и двух строк в программе сделать функцию без дополнительных объявлений, которую можно сразу использовать в строке.Цитата:
Ну стрелочка вверх это тот же R-Trig на самом деле.
Филоненко Владислав я понимаю, что тема про среду, но характеристики железки тоже интересуют. По фотке видно, что какой-то Rockchip стоит - какой именно?, ну и остальные х-ки...
Интересует в каком плане. Берется несколько штук, используются как ПЛК, на один накидывается Scada (варианты? пока на вскидку RapidScada, Pult-online, IntraScada, SimpLight) - и используется как агрегатор для остальных ПЛК.
з.ы. можете отдельную тему создать именно по железу, не против. Мне понять возможно ли такое?
Либу конечно можно, это вообще изи и из коробки
указатель на функцию - вещи крайне опасная, ещё опаснее просто указателя. Указатели долой - вы, товарищ, наш герой! Это хороший надёжный вариант! К губам Валенка добавим ValenokMode - где всякие расширения ST запрещены!
Оборудование ВСЕГДА делается под конкретные задачи. Задач обеспечить СТАБИЛЬНОЕ время реакции на уровне единиц мкс нам не ставили (для ПЛК общепромышленного применения). Поэтому да, можно и нет смысла одновременно.
К тому же оборудование с ТАКИМИ возможностями стоит совсем другой порядок цены!
Список запретов обсуждается