Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Как перевести число в строку бит?  (Прочитано 11496 раз)

Pavell

  • Новичок
  • *
  • Сообщений: 20
    • Просмотр профиля
Как перевести число в строку бит?
« : 17 Января 2017, 13:31:26 »
собственно вопрос - например 1 = "00000001"
есть стандартная функция какая-то или надо что-то выдумывать?
в математических функциях тоже не нашел целочисленного деления и остатка от деления.
И еще вопрос - как инициализировать и работать с массивами.
необходимо для пересчета входного значения с нелинейной зависимостью?

TeNQ

  • Постоялец
  • ***
  • Сообщений: 200
    • Просмотр профиля
Re: Как перевести число в строку бит?
« Ответ #1 : 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 есть, например состояние кнопки и тд) Но было отказано) Так что никак.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Как перевести число в строку бит?
« Ответ #2 : 17 Января 2017, 14:55:04 »
Цитировать
собственно вопрос - например 1 = "00000001"
Для этого можно воспользоваться функцией GetBit:

Код
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.

TeNQ

  • Постоялец
  • ***
  • Сообщений: 200
    • Просмотр профиля
Re: Как перевести число в строку бит?
« Ответ #3 : 17 Января 2017, 15:26:04 »
Цитировать
Сейчас можно работать только с локальными массивами, которые существуют в пределах процедуры/функции, например так:
Я проверял на работу с локальными массивами, у меня проект скомпилировался, но когда я запускал клиент - он бесконечно висел в запуске. С вашим примером у меня ровно также получилось. Что я делаю не так?

Pavell

  • Новичок
  • *
  • Сообщений: 20
    • Просмотр профиля
Re: Как перевести число в строку бит?
« Ответ #4 : 17 Января 2017, 15:29:31 »
Спасибо за четкие развернутые ответы.
думаю локальными массивами обойдусь.
так прокатит?
aMyArray: array[1..4] of Integer;
aMyArray[] := {130,120,100,70};
и вообще это что за язык? где подробней про него почитать?
ладно. будем пробовать.. еще раз спасибо.
TeNQ, а вот даже как.. хм..

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Как перевести число в строку бит?
« Ответ #5 : 17 Января 2017, 15:29:47 »
TeNQ, видимо Вы создали новый проект и без перезапуска сервера пытаетесь подключиться к этому проекту. А сервер узнает о нём только при очередном запуске.
« Изменён: 17 Января 2017, 15:35:05 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Как перевести число в строку бит?
« Ответ #6 : 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

TeNQ

  • Постоялец
  • ***
  • Сообщений: 200
    • Просмотр профиля
Re: Как перевести число в строку бит?
« Ответ #7 : 17 Января 2017, 15:37:52 »
TeNQ, видимо Вы создали новый проект и без перезапуска сервера пытаетесь подключиться к этому проекту. А сервер узнает о нём только при очередном запуске.
Да все верно. Прощу прощения, все работает. Я и забыл про эту "особенность"))
« Изменён: 17 Января 2017, 15:38:48 от TeNQ »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Как перевести число в строку бит?
« Ответ #8 : 17 Января 2017, 15:39:05 »
Надо будет сделать показ соответствующего уведомления, а ещё лучше автопоиск проекта и последующий его запуск. Сделаем со временем.

Pavell

  • Новичок
  • *
  • Сообщений: 20
    • Просмотр профиля
Re: Как перевести число в строку бит?
« Ответ #9 : 17 Января 2017, 15:46:52 »
Цитировать
Поэтому придется делать не самым удобным способом:
ну таким способом записывать таблицу на 128 или 256 значений конечно очень печально. надо что-то думать...
ну хотя в этом случае на помощь придет excel и макросы)
выход есть)
« Изменён: 17 Января 2017, 15:48:46 от Pavell »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Как перевести число в строку бит?
« Ответ #10 : 17 Января 2017, 15:49:14 »
Pavell можно из текстового файла их считать в массив, если это подходит и если не нужно слишком часто.
« Изменён: 17 Января 2017, 15:49:51 от Simple-Scada »

Pavell

  • Новичок
  • *
  • Сообщений: 20
    • Просмотр профиля
Re: Как перевести число в строку бит?
« Ответ #11 : 17 Января 2017, 16:09:27 »
Это вот этой функцией:
function TextFileReadLn: string;?
а как она работает? т.е. какую строку и из какого файла она читает?
вообще задача такая- из OPC переменной получаем тэг , который представляет из себя значение АЦП. а физически на этом АЦП висит термосопротивление, а его зависимость от температуры нелинейна и надо считать по таблицам
вот если что. так вот хранить эти таблицы в контроллере как-то очень расточительно т.к. там памяти как всегда не хватает и было бы замечательно , если бы была такая функция
value=CalcTable(tag,file);
которая считала бы значение из таблицы в файле.. но это как я понимаю из разряда не скорых хотелок)
пока мне для хозяйственно бытовых нужд придется обойтись значением АЦП.

Teodor

  • Старожил
  • ****
  • Сообщений: 256
    • Просмотр профиля
Re: Как перевести число в строку бит?
« Ответ #12 : 17 Января 2017, 19:07:15 »
Кстати, вопрос по сабжу... Локальный массив, он-же уничтожается после окончания скрипта? То-есть читать в него НЕ вариант...

А как насчет на ОРС сотворить переменных, подтянуть их в скаду и столь же муторно сравнивать по очереди?

Pavell

  • Новичок
  • *
  • Сообщений: 20
    • Просмотр профиля
Re: Как перевести число в строку бит?
« Ответ #13 : 18 Января 2017, 06:36:23 »
Кстати, вопрос по сабжу... Локальный массив, он-же уничтожается после окончания скрипта? То-есть читать в него НЕ вариант...

А как насчет на ОРС сотворить переменных, подтянуть их в скаду и столь же муторно сравнивать по очереди?
наверное надо отдельный топик по массивам создавать)

Simple-Scada

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

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

Кстати, вопрос по сабжу... Локальный массив, он-же уничтожается после окончания скрипта? То-есть читать в него НЕ вариант...
А как насчет на ОРС сотворить переменных, подтянуть их в скаду и столь же муторно сравнивать по очереди?
Да, все локальные переменные уничтожаются после выполнения скрипта. А сравнивать переменные можно и без массивов, напрямую. Или Вы говорите про переменные-массивы на OPC-сервере?