Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: Pavell от 17 Января 2017, 13:31:26

Название: Как перевести число в строку бит?
Отправлено: Pavell от 17 Января 2017, 13:31:26
собственно вопрос - например 1 = "00000001"
есть стандартная функция какая-то или надо что-то выдумывать?
в математических функциях тоже не нашел целочисленного деления и остатка от деления.
И еще вопрос - как инициализировать и работать с массивами.
необходимо для пересчета входного значения с нелинейной зависимостью?
Название: Re: Как перевести число в строку бит?
Отправлено: TeNQ от 17 Января 2017, 14:20:02
Цитировать
в математических функциях тоже не нашел целочисленного деления и остатка от деления.
Целочисленное деление - оператор div . Остаток от деления - оператор mod.
http://informatics.mccme.ru/mod/book/view.php?id=5115
 Это стандартные операторы Паскаля и в руководстве по скриптам жирно так написано на стр.3 в самом верху, что делать в таких случаях.

Цитировать
собственно вопрос - например 1 = "00000001"
есть стандартная функция какая-то или надо что-то выдумывать?
Перевод из десятичной в двоичную систему в Паскале, как я вижу на примерах в интернете идет через деление на базу и разложение в массив.
http://mypascal.ru/news/perevod_v_dvoichnuju_sistemu/2014-01-19-8

Цитировать
И еще вопрос - как инициализировать и работать с массивами.
необходимо для пересчета входного значения с нелинейной зависимостью?
Еще в бете SS2 я просил ввести массивы для пользователя. (Так то массивы в SS2 есть, например состояние кнопки и тд) Но было отказано) Так что никак.
Название: Re: Как перевести число в строку бит?
Отправлено: Simple-Scada от 17 Января 2017, 14:55:04
Цитировать
собственно вопрос - например 1 = "00000001"
Для этого можно воспользоваться функцией GetBit (http://simple-scada.com/scripts_manual?section=global_procedure):

Код
var
  I: Integer;
  aFrom: Integer;   // число из которого будем брать биты
  aTo: string;      // строка в которую будем писать биты
begin
  aFrom := 1;       // инициализируем единицей
  aTo := '';        // инициализируем пустой строкой

  { декрементный цикл от 7 до 0 (т.е. выполнится 8 раз) }
  for I := 7 downto 0 do   
    if GetBit(aFrom, I) then
      aTo := aTo + '1'
    else
      aTo := aTo + '0';

  // в результате имеем строку aTo которая содержит '00000001'
end;

Цитировать
И еще вопрос - как инициализировать и работать с массивами.
Сейчас можно работать только с локальными массивами, которые существуют в пределах процедуры/функции, например так:

Код
var
  I: Integer;
  aMyArray: array[1..10] of Integer;
begin
  { заполняем массив случайными целыми числами от 0 до 19 }
  for I := 1 to 10 do
    aMyArray[I] := Random(20);
end.
Название: Re: Как перевести число в строку бит?
Отправлено: TeNQ от 17 Января 2017, 15:26:04
Цитировать
Сейчас можно работать только с локальными массивами, которые существуют в пределах процедуры/функции, например так:
Я проверял на работу с локальными массивами, у меня проект скомпилировался, но когда я запускал клиент - он бесконечно висел в запуске. С вашим примером у меня ровно также получилось. Что я делаю не так?
Название: Re: Как перевести число в строку бит?
Отправлено: Pavell от 17 Января 2017, 15:29:31
Спасибо за четкие развернутые ответы.
думаю локальными массивами обойдусь.
так прокатит?
aMyArray: array[1..4] of Integer;
aMyArray[] := {130,120,100,70};
и вообще это что за язык? где подробней про него почитать?
ладно. будем пробовать.. еще раз спасибо.
TeNQ, а вот даже как.. хм..
Название: Re: Как перевести число в строку бит?
Отправлено: Simple-Scada от 17 Января 2017, 15:29:47
TeNQ, видимо Вы создали новый проект и без перезапуска сервера пытаетесь подключиться к этому проекту. А сервер узнает о нём только при очередном запуске.
Название: Re: Как перевести число в строку бит?
Отправлено: Simple-Scada от 17 Января 2017, 15:34:41
Цитировать
так прокатит?
aMyArray: array[1..4] of Integer;
aMyArray[] := {130,120,100,70};
С глобальными переменными так можно было бы сделать, но в данном случае так не получится, т.к. возможно только локальное использование. Поэтому придется делать не самым удобным способом:
Код
var
  aMyArray: array[1..4] of Integer;
begin
  aMyArray[1] := 130;
  aMyArray[2] := 120;
  aMyArray[3] := 100;
  aMyArray[4] := 70;
end;

Цитировать
и вообще это что за язык? где подробней про него почитать?
pascal/delphi
Название: Re: Как перевести число в строку бит?
Отправлено: TeNQ от 17 Января 2017, 15:37:52
TeNQ, видимо Вы создали новый проект и без перезапуска сервера пытаетесь подключиться к этому проекту. А сервер узнает о нём только при очередном запуске.
Да все верно. Прощу прощения, все работает. Я и забыл про эту "особенность"))
Название: Re: Как перевести число в строку бит?
Отправлено: Simple-Scada от 17 Января 2017, 15:39:05
Надо будет сделать показ соответствующего уведомления, а ещё лучше автопоиск проекта и последующий его запуск. Сделаем со временем.
Название: Re: Как перевести число в строку бит?
Отправлено: Pavell от 17 Января 2017, 15:46:52
Цитировать
Поэтому придется делать не самым удобным способом:
ну таким способом записывать таблицу на 128 или 256 значений конечно очень печально. надо что-то думать...
ну хотя в этом случае на помощь придет excel и макросы)
выход есть)
Название: Re: Как перевести число в строку бит?
Отправлено: Simple-Scada от 17 Января 2017, 15:49:14
Pavell можно из текстового файла (http://simple-scada.com/scripts_manual?section=text-file) их считать в массив, если это подходит и если не нужно слишком часто.
Название: Re: Как перевести число в строку бит?
Отправлено: Pavell от 17 Января 2017, 16:09:27
Это вот этой функцией:
function TextFileReadLn: string;?
а как она работает? т.е. какую строку и из какого файла она читает?
вообще задача такая- из OPC переменной получаем тэг , который представляет из себя значение АЦП. а физически на этом АЦП висит термосопротивление, а его зависимость от температуры нелинейна и надо считать по таблицам
вот (http://aterlux.ru/index.php?page=article&art=ntcresistor) если что. так вот хранить эти таблицы в контроллере как-то очень расточительно т.к. там памяти как всегда не хватает и было бы замечательно , если бы была такая функция
value=CalcTable(tag,file);
которая считала бы значение из таблицы в файле.. но это как я понимаю из разряда не скорых хотелок)
пока мне для хозяйственно бытовых нужд придется обойтись значением АЦП.
Название: Re: Как перевести число в строку бит?
Отправлено: Teodor от 17 Января 2017, 19:07:15
Кстати, вопрос по сабжу... Локальный массив, он-же уничтожается после окончания скрипта? То-есть читать в него НЕ вариант...

А как насчет на ОРС сотворить переменных, подтянуть их в скаду и столь же муторно сравнивать по очереди?
Название: Re: Как перевести число в строку бит?
Отправлено: Pavell от 18 Января 2017, 06:36:23
Кстати, вопрос по сабжу... Локальный массив, он-же уничтожается после окончания скрипта? То-есть читать в него НЕ вариант...

А как насчет на ОРС сотворить переменных, подтянуть их в скаду и столь же муторно сравнивать по очереди?
наверное надо отдельный топик по массивам создавать)
Название: Re: Как перевести число в строку бит?
Отправлено: Simple-Scada от 18 Января 2017, 20:08:04
Цитировать
Это вот этой функцией:
function TextFileReadLn: string;?
а как она работает? т.е. какую строку и из какого файла она читает?
Хороший пример есть в стандартном Демо-проекте. Страница "Скрипты" -> "Работа с файлами".

Цитировать
value=CalcTable(tag,file);
которая считала бы значение из таблицы в файле.. но это как я понимаю из разряда не скорых хотелок)
да, сначала нужно внедрить другие более популярные возможности, поэтому в ближайшее время это вряд ли возможно.

Кстати, вопрос по сабжу... Локальный массив, он-же уничтожается после окончания скрипта? То-есть читать в него НЕ вариант...
А как насчет на ОРС сотворить переменных, подтянуть их в скаду и столь же муторно сравнивать по очереди?
Да, все локальные переменные уничтожаются после выполнения скрипта. А сравнивать переменные можно и без массивов, напрямую. Или Вы говорите про переменные-массивы на OPC-сервере?
Название: Re: Как перевести число в строку бит?
Отправлено: Teodor от 24 Января 2017, 18:48:20
А сравнивать переменные можно и без массивов, напрямую. Или Вы говорите про переменные-массивы на OPC-сервере?
нет, нет... Именно так. Имелось в виду, что переменные на опс могут быть локальными, или из базы подтянутыми, а не грузить полудохлый контроллер.
Название: Re: Как перевести число в строку бит?
Отправлено: Xskif от 24 Мая 2021, 06:05:32
Я просто в шоке, почему тут всё так сложно   :)
Достаточно первое число сделать первым элементом массива, а остатки от деления записывать в следующие элементы. И так до тех пор, пока остаток не станет меньше основания системы счисления. И это верно не только для двоичных, а для всех позиционных систем счисления. Если есть дробная часть, то её переводить отдельно.
Алгоритм:
1)Делим нужное число на основание
2) Делим остаток 1 на основание..
3)Делим остаток 2 на основание..
....
N)Остаток N< основания - записываем число снизу вверх
Вот пример реализации на JS: https://tvoyapecarnya.ru/informaics/sistemy-ischisleniya/pozitsionnyesistemyschisleniya/dvoichnaya-sistema-ischisleniya/kak-perevodit-v-dvoichnuyu-sistemu (https://tvoyapecarnya.ru/informaics/sistemy-ischisleniya/pozitsionnyesistemyschisleniya/dvoichnaya-sistema-ischisleniya/kak-perevodit-v-dvoichnuyu-sistemu)
Название: Re: Как перевести число в строку бит?
Отправлено: Simple-Scada от 24 Мая 2021, 17:14:41
Xskif, это старая тема от 24 января 2017 года.
А 19 июля 2017 года в скаду встроена готовая функция IntToBin, которая описана в руководстве по ссылке (https://simple-scada.com/help/script/inttobin.html).