Шарп в 1.2.11 появился, в объект добавляется "Программа C#". По плюсам был вебинар https://www.youtube.com/watch?v=gXwOYFsKJ2c
Шарп в 1.2.11 появился, в объект добавляется "Программа C#". По плюсам был вебинар https://www.youtube.com/watch?v=gXwOYFsKJ2c
Большое спасибо! этот вебинар нечто - из "+" информативность - однако нет описания что и от куда берут, к примеру что за masterplcap? сам проект к видео не приложен.
Последний раз редактировалось nub; 14.01.2021 в 14:15.
nub тогда наверное вам проще обновиться до версии, где есть C#, я правда не знаю всех механизмов, как в нем писать скрипты (программы) на C# по этому не подскажу правильность кода, но там будет несколько строк всего и привязать это к кнопкам или другим элементам интерфейса.
в моем случае формула чтения значений из файла находится в самом первом канале БД, а записи в самом последнем и если значения менялись в процессе, то происходит запись в файл а при перезагрузке происходит чтение, но можно привязать и к кнопке интерфейса или даже внешней команде.
Последний раз редактировалось melky; 14.01.2021 в 09:18.
VladGC самый простой способ через Словарь массив строк командами, что написал выше. Парсить ничего не надо тогда специально.
как обновиться в Masterscada4D? в меню не нашел - текущая версия 1.2.9 - поддержка внешнего кода у ФБ st есть как в вебинаре, только очень сложный алгоритм с подгрузкой библиотек - проект пока не удалось сделать.
будет ли эл. ключ работать после обновления?
Последний раз редактировалось nub; 14.01.2021 в 14:04.
ясно. большое спасибо!!!
попробую сначала через file to string прочитать txt файл, затем string - на части (с помощью функций работы со строками) и присвоить переменным; если не пойдет, обновлюсь.
Кстати, а что будет в Masterscada4d при передачи данных командой file to string размер данных файла будет больше объема переменной типа string (к примеру в txt файле 1000 символов - и как теперь их прочитать все)
FileToString читает в одну строку, а ReadAllLines читает в массив строк, которые надо будет все равно разбить на столбцы,
Получается что уходит одна итерация
Думаю стоит обновиться или подождать версии 1.2.12 , должна скоро выйти по идее..
По крайне мере, как предложил melky, может действительно лучше на с#, примеров в сети много, да и возможности побогаче
Все норм будет(одна большая строка):
Вложение 53019
FileToString читает в одну строку, а ReadAllLines читает в массив строк, которые надо будет все равно разбить на столбцы,
Получается что уходит одна итерация
Попробовал ReadAllLines с примером из https://www.cyberforum.ru/csharp-beg...ad1736667.html
Ошибка: CS0029: Не удается неявно преобразовать тип "int[*,*]" в "int[]".Код:class Program { static void Main(string[] args) { string[] lines = File.ReadAllLines(@"D:\input.txt"); int[,] num = new int[lines.Length, lines[0].Split(' ').Length]; for (int i = 0; i < lines.Length; i++) { string[] temp = lines[i].Split(' '); for (int j = 0; j < temp.Length; j++) num[i, j] = Convert.ToInt32(temp[j]); } Параметр_1=num; } }
Не удается неявно преобразовать тип "int[*,*]" в "int[]"
Хотя сама переменная в MasterScada с типом ARRAY [*,*] OF DINT
В принципе добить можно до рабочего состояния, по крайней мере все читает как надо
Думаю стоит обновиться или подождать версии 1.2.12 , должна скоро выйти по идее..
По крайне мере, как предложил melky, может действительно лучше на с#, примеров в сети много, да и возможности побогаче
Все норм будет(одна большая строка):
Screenshot_1.png
VladGC , эээ, пожалуй я приведу весь свой код, делал очень давно и возможно тут фокусы с Linq. я это делал в RapidScada, по этому не знаю, как эти же механизмы использовать в MasterScada, но может поможет понять и сделать как вам нужно.
У меня это три "формулы" - скрипта.
Чтение переменных - SetVal здесь встроенная функция Scada системы записать в канал № значение SetVal(1000, 23.6) пример
Объявление переменной как RetainКод:bool initRet = false; double LoadRet() { if (!initRet) { if (System.IO.File.Exists(pathRet)) { string[] RetLoad = System.IO.File.ReadAllLines(pathRet, Encoding.UTF8); for (int i = 0; i < RetLoad.Length; i++) { SetVal(Convert.ToInt32(RetLoad[i].Substring(RetLoad[i].IndexOf("[")+1, RetLoad[i].IndexOf(", ")-(RetLoad[i].IndexOf("[")+1)),10),Convert.ToDouble(RetLoad[i].Substring(RetLoad[i].IndexOf(", ")+2,RetLoad[i].IndexOf("]")-(RetLoad[i].IndexOf(", ")+2)))); } initRet = true; } } return Convert.ToDouble(initRet); }
Запись в файлКод:string pathRet = @"/home/pi/scada/ScadaServer/Config/retain.txt"; Dictionary<int, double> DictRet = new Dictionary<int, double>(); public double Retain (double ret) { DictRet[CnlNum] = ret; return ret; }
Все таки есть преобразования в строку при записи в файл и обратное преобразование в числа int и doubleКод:double SaveRet() { string[] RetSave = new string[DictRet.Count]; bool eq = false; for (int i = 0; i < DictRet.Count; i++) { RetSave[i] = Convert.ToString(System.Linq.Enumerable.ElementAt(DictRet, i)); } if (!System.IO.File.Exists(pathRet)) { System.IO.File.WriteAllLines(pathRet, RetSave, Encoding.UTF8); return 0; } else { string[] RetOld = System.IO.File.ReadAllLines(pathRet, Encoding.UTF8); eq = System.Linq.Enumerable.SequenceEqual(RetOld, RetSave); if (!eq) { System.IO.File.WriteAllLines(pathRet, RetSave, Encoding.UTF8); } } return Convert.ToDouble(eq); }
Скобочки [ и ] это я оказывается для красоты замутил что лихотч не, это скорее особенность какого-то механизма при записи.
При записи я не парился с конвертированием Key и Value словаря, а сделал это через Linq. Обратно уже по одному. Вполне возможно можно обрезать лишние скобки и разделить строку и как то быстрее сделать при чтении но как-то особо не парился...
Последний раз редактировалось melky; 15.01.2021 в 23:14.