VladGC самый простой способ через Словарь массив строк командами, что написал выше. Парсить ничего не надо тогда специально.
Вид для печати
VladGC самый простой способ через Словарь массив строк командами, что написал выше. Парсить ничего не надо тогда специально.
как обновиться в Masterscada4D? в меню не нашел - текущая версия 1.2.9 - поддержка внешнего кода у ФБ st есть как в вебинаре, только очень сложный алгоритм с подгрузкой библиотек - проект пока не удалось сделать.
будет ли эл. ключ работать после обновления?
ясно. большое спасибо!!!
попробую сначала через 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, может действительно лучше на с#, примеров в сети много, да и возможности побогаче
Все норм будет(одна большая строка):
Вложение 53020
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. Обратно уже по одному. Вполне возможно можно обрезать лишние скобки и разделить строку и как то быстрее сделать при чтении но как-то особо не парился...
Здравствуйте!
Скачал бесплатную одночасовую версию Мастерскада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.
Пробовал добавлять локальную промежуточную переменную и по ней в следующем цикле обнулять, эффект тот же.
Вероятно я упускаю что-то простое, тыкните носом пожалуйста.
Через внешний канал модбас приходит 1, к каналу привязана переменная с типом InOut "MB_ALL_OFF".
По тригеру на этой переменной в программе исполняется код, в конце него обнуляю переменную. Что бы внешнее устройство увидело 0 в регистре.
Соответственно переменная обнуляется, но на следующем цикле она снова 1. Ощущение, что она не записывается в регистр.
Тогда получается что это самое внешнее устройство опять посылает 1
Опять же не понятно,
Где и как идет опрос.
В masterscada4D стоит протокол modbus, по нему читаете регистры, которые в плк 110 находятся во внешних каналах?
Вложение 53682
Проверял через qmodmaster, из него посылал единицу на нужный внешний канал плк 110 через ModbusTCP.
Протокол Modbus в данном конкретном примере исключил, да и вообще выкинул все. Оставил встроенный DI и DO и один внешний канал.
Вложение 53684
Попробуйте создать переменную вне программы, либо в узле либо в объеке, далее перетащите ее во внешние каналы, а затем связать на чтение и запись в программеВложение 53698
Здравствуйте коллеги. Подскажите пожалуйста. Не загружаются узлы в MasterScada 4D из MasterOPC Universal Modbus Server через протокол MQTT. В OPC MQTT клиент там где нужно указать IP-адрес, указываю адрес брокера, причем в MS4D при нажатии кнопки загрузить якобы происходит загрузка, написано что загрузка завершена, но теги не отображаются. Кто сталкивался помогите пожалуйста.
Если ещё актуально, то в МС4Д есть протокол MQTT и ни какой ОРС уже не нужен.
Здравствуйте!
Вроде уже задавал этот вопрос тут, но может кто-то уже поразбирался с HTTP клиентом.
Вопрос такой: на выходе получается строка с кучей строк. Как её разбить на составляющие?
Например:
{
"ServerState": "Active",
"ArchiveSizeMb": 26720,
"ArchiveWriteSpeedMBps": 0,
"ArchiveDepthDays": 48.95885554461342,
"IsArchiveOverload": false,
"ArchiveErrors": {
"ErrorDb": false,
"ErrorFrameSaving": false,
"ErrorAllDrives": null,
"ErrorFramesShrinked": false,
"BadSmartStatus": false
}
}
Можно через функцию работы со строками, но как мне показалось это весьма неудобно и не гибко.
Есть ещё какие-либо варианты?
Minarion через массив строк и в список например
У вас приходит ответ в формате JSON. В справке есть статья "Соответствие элементов JSON и MasterSCADA 4D" (Проект в MasterSCADA 4D - Справочная информация). Если коротко, то вам в библиотеке необходимо создать собственный тип данных (в вашем случае это будет структура), а затем преобразовать его в строку при помощи стандартной функции. Как результат, ваша структура наполнится значениями, с которыми дальше работаете как с отдельными переменными.
Вложение 54877
Вложение 54878
Доброго времени суток .
Добился работы Playsound от кнопки с экрана , но никак не могу добиться от BOOL значения true/false с аварий . Может есть какой то ньанс ?Вложение 54949
Что значит "добиться от BOOL значения true/false с аварий"?
Заместо кнопки , пытался вставить булевую переменную ( авария в программе ) , но звука нет . На скриншоте видно там висит в "play" СО первый порог для теста .
А какая версия? Какой браузер? Я знаю, что в хроме нужно разрешать воспроизведение звука: chrome://settings/content/sound
Попробовал спустя неделю еще раз сделать ... и все заработало , мистика .
Здравствуйте!
Вопрос по протоколу Postgres.
Возможно ли в запросе, а конкретно там где прописывается команда, завести строковый параметр из ST программы? Пробовал, но до команды ничего не доходит.
Фактически прошло полгода.
Разделил на 4 протокола, увеличил интервал опроса до 10 секунд. Не помогло.
ТП пишет что заявка в работе, но никакой конкретики не даёт. Последнее время по этой проблеме отвечают на одно письмо из трех.
Такое себе.
Похоже что связка MasterOPC + MS4D ещё весьма сыровата...
Добрый день!
Есть ли аналог элемента "Выбор изображения" в этой скаде?
Здравствуйте. Впервые начал работать со Скадой. До этого вообще никакого опыта в работе со скадами не было. Имеем - МастерСкада 4Д, плк B&R X20CP3585. Нужно передать между ними огромные массивы данных, в общей сложности около 8000 тэгов по Modbus TCP. Самый большой массив данных составляет около 600 DINT. Вопрос - как это сделать с наименьшими затратами? Можно ли настроить каналы передачи данных таким образом, чтобы не прописывать каждый канал по отдельности, а сразу задать канал передачи данных, размером, скажем, в 600 DINT?
Второй вопрос - знаю, что эту проблему можно решить с помощью некого OPC-сервера. Что это такое и как это сделать? Прощу прощения за глупые вопросы, никогда с этим не сталкивался, сроки поджимают.
Modbus ограничен 256 байтами или около того, если не ошибаюсь. Соответственно у вас будет несколько запросов.
не прописывать не получится.
Можно сделать БЕЗ некого ОРС, любая Scada со встроенным Modbus драйвером. Таких есть несколько, от бесплатных до платных.
Это к вопросу выбора MasterScada, да еще 4Д
в мастерскаде есть импорт карты модбас регистров.
MrLonely импорт с бумажной документации от производителя? ну просто круто :)
Здравствуйте.
У меня сейчас архив данных (БД SQLite) пишется в один файл (data.db). Подскажите, как сделать, чтобы архивная база данных заново создавалась с нужной мне периодичностью. Например, каждые сутки, или каждую неделю. Не удаляя при этом старую
Добрый день.
На данный момент такой возможности нет. Можете написать этот вопрос на почту support.ms4d@masterscada.ru, чтобы обсудить варианты решения задачи?
Здравствуйте!
У кого-то есть опыта использования СУБД Firebird как источника данных в MS4D? Только через скрипты lua в ModbusOPC Server?
Здравствуйте! Необходимо отображение структуры здания в виде дерева, и переход на окно элемента при выборе его в дереве. В палитре есть папка Контролы, где имеется элемент Дерево одиночного выбора. Прошу знающих людей уточнить - это то что нужно? К сожалению справка на него отсутствует, как пользоваться не понятно, поиск по интернет так же результатов не дает. Есть ли еще варианты разворачиваемых/сворачиваемых списков?
Вложение 56469Вложение 56470
На вход контрола дерева одиночного/множественного подаете строку в формате JSON. Дерево его отображает.
Получить результат который вы выбрали можно из параметра "Значения"
Тип источника custom
Вложение 56468