VladGC самый простой способ через Словарь массив строк командами, что написал выше. Парсить ничего не надо тогда специально.
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.
Здравствуйте!
Скачал бесплатную одночасовую версию Мастерскада4Д1.2.Формирую отчёт с помощью функции ReportFB. Старался сделать всё, как написано в хелпе ПО. Блок при запуске Execute выдаёт ошибку Can't parse response.
Подскажите пожалуйста, что это и как исправить. Или где посмотреть: гугл и хелп не находят.
Дайте скриншот программы и отчета, что бы глянуть как оно выглядит
Есть документация от производителя самого отчета, но это не ваш случай
https://www.stimulsoft.com/ru/docume...e/user-manual/
Коллеги, приветствую! Есть MasterSCADA 4D + ОВЕН110 MS4
Есть внешний канал modbus связанный с переменной InOut BOOL (свойство сохранять - выключено).
По приходу 1 выполняется некая подпрограмма, после ее выполнения регистр нужно обнулить. Никак не получается этого сделать, упрощенный пример:
R_TRIG_5(CLK:= MB_ALL_OFF );
IF R_TRIG_5.Q THEN
MB_ALL_OFF:= FALSE; (*Для сквозных переменных отключить свойство сохранять*)
END_IF
Переменная сбрасывается и сразу возвращается в TRUE.
Пробовал добавлять локальную промежуточную переменную и по ней в следующем цикле обнулять, эффект тот же.
Вероятно я упускаю что-то простое, тыкните носом пожалуйста.