Типы данных

Язык Control поддерживает следующие типы данных:

Тип данныхДиапазон значенийКомментарий
anytype (см. 5) Тип (один из перечисленных ниже) определяется автоматически при первом присвоении переменной значения
atime Время аларма, с дополнительным индексом в случае нескольких одновременных алармов
bit32 (см. 1)от 0 до +4294967295Набор битов (32 бита)
bit64 (см. 1)от 0 до+10146744073709551615Набор битов (64 бита)
blob (см. 9) Binary large objects (большой двоичный объект)
bool0, 1 или true, falseДвоичное значение (1 бит)
charот 0 до 255Символ (1 байт). Также может представлять собой числовое значение в диапазоне от 0 до 255. Примером может служить атрибут конфигурационного элемента элемента точки данных _lock.._man_type
doubleот -1.79769e+308 до +1.79769e+308Число с плавающей точкой (64 бита) 
errClass Класс ошибки
file Указатель позиции в файле
floatот -1.79769e+308 до +1.79769e+308Значение с плавающей точкой.В «КАСКАД Цифра» тип «float» эквивалентен типу «double» (64 бита), вне зависимости от того, идет ли речь об элементе точки данных или о сценарии CTRL
intот -2147483648 до +2147483647Целое число (32 бита)
uintот 0 до +4294967295Положительное целое число (32 бита)
longот -9223372036854775808 до +9223372036854775807Целое число (64 бита) В случае константы, тип «long» задается при помощи суффикса «L» в конце константы. Пример: 0x7FFFFFFFFFFFFFFFL.
ulongот 0 до +18446744073709551615Положительное целое число (64 бита). В случае константы, тип «ulong» задается при помощи суффикса «UL» в конце константы. Пример: 0x7FFFFFFFFFFFFFFFUL
langString Многоязычная строка (см. раздел Поддержка многоязычности)
mixed (см. 7) В отличие от переменной с типом «anytype», переменная с типом «mixed» изменяет свой тип при каждом присваивании. Таким образом, переменной с типом «mixed» может быть присвоено любое значение
mapping (см. 8) Переменные данного типа используются для хранения произвольных пар ключ-значение. Пары сохраняются в двух массивах
va_list Тип «va_list» используется при передаче в функцию произвольного количества аргументов при ее вызове. «va_start» обеспечивает сохранение в переменной с типом «va_list» значений тех аргументов, которые были переданы в функцию при ее вызове. «va_arg» позволяет считать следующее значение, сохраненное в переменной с типом «va_list». «va_end» прекращает работу с переменной с типом «va_list» (см. также раздел «Параметры«)
string (см. 1)любое количество символовСимвольная строка
time (см. 2) Внутренний формат времени
unsignedот 0 до 4,294,967,295Положительное целое числоНеобходимо отметить, что попытка присваивания переменной с типом «usigned» значения 4294967295  приводит к синтаксической ошибке. Ошибка возникает в связи с тем, что при отсутствии каких-либо признаков, указывающих на тип числа, по умолчанию все числа обрабатываются как целые числа. Для присваивания беззнаковой переменной значения 4294967295 необходимо использовать символ «u» (= без знака): unsigned f = 4294967295u;Тот же символ используется в случае с шестнадцатеричными переменными и значением 4294967295
dyn_anytype (см. 5) Динамической массив элементов, имеющих тип «anytype»
dyn_atime (см. 3) Динамической массив элементов, имеющих тип «atime» (atime — время аларма).Динамический массив «dyn_atime» содержит элементы с типом «atime» и представляет собой комбинацию «DpIdentifier» (ИД точки данных), времени и индекса. Включает в себя конфигурационный элемент и признак «Detail», но не элемент точки данных, например:»:_alert_hdl.2″ + 2009.08.12 19:11:54.356 (0)
dyn_bit32 (см. 3) Динамический массив элементов, имеющих тип «bit32» (32 бита)
dyn_bit64 (см. 3) Динамический массив элементов, имеющих тип «bit64» (64 бита)
dyn_blob (см. 3) Динамический массив элементов, имеющих тип «blob»
dyn_bool (см. 3) Динамической массив элементов, имеющих тип «bool»
dyn_char (см. 3) Динамической массив элементов, имеющих тип «char»
dyn_errClass (см. 3) Динамический массив элементов, имеющих тип «errClass» (класс ошибки «КАСКАД Цифра»)
dyn_float (см. 3) Динамической массив чисел с плавающей точкой
dyn_int (см. 3) Динамической массив целых чисел (32 бита)
dyn_uint (см. 3) Динамической массив положительных целых чисел (32 бита)
dyn_long (см. 3)  Динамический массив целых чисел (64 бита)
dyn_ulong (см. 3)  Динамической массив положительных целых чисел (64 бита)
dyn_langString (см. 3) Динамический массив многоязычных строк (см. раздел «Поддержка многоязычности«)
dyn_mapping (см. 8) Динамический массив элементов, имеющих тип «mapping» (mapping = ассоциативный массив). Переменные данного типа используются для хранения произвольных пар ключ-значение. Пары сохраняются в двух массивах
dyn_string (см. 3) Динамической массив символьных строк
dyn_time (см. 3) Динамической массив значений во внутреннем формате времени
dyn_dyn_anytype (см. 5) Динамический массив из динамических массивов элементов, имеющих тип «anytype»
dyn_dyn_atime (см. 4) Динамический массив из динамических массивов элементов, имеющих тип «atime»
dyn_dyn_bit32 (см. 4) Динамический массив из динамических массивов элементов, имеющих тип «bit32» (32 бита)
dyn_dyn_bit64 (см. 4) Динамический массив из динамических массивов элементов, имеющих тип «bit64» (64 бита)
dyn_dyn_blob (см. 4) Динамический массив из динамических массивов элементов, имеющих тип «blob»
dyn_dyn_bool (см. 4) Динамический массив из динамических массивов элементов, имеющих тип «bool» (двоичное значение)
dyn_dyn_char (см. 4) Динамический массив из динамических массивов элементов, имеющих тип «char» (символ)
dyn_dyn_errClass (см. 4) Динамический массив из динамических массивов элементов, имеющих тип «errClass» (класс ошибки)
dyn_dyn_float (см. 4) Динамический массив из динамических массивов элементов, имеющих тип «float» (с плавающей точкой)
dyn_dyn_int (см. 4) Динамический массив из динамических массивов элементов, имеющих тип «integer» (целые числа 32 бита)
dyn_dyn_uint (см. 4) Динамический массив из динамических массивов элементов, имеющих тип «uint» (положительные целые числа 32 бита)
dyn_dyn_long (см. 4) Динамический массив из динамических массивов элементов, имеющих тип «long» (целые числа 64 бита)
dyn_dyn_ulong (см. 4) Динамический массив из динамических массивов элементов, имеющих тип «ulong» (положительные целые числа 64 бита)
dyn_dyn_langString (см. 4) Динамический массив из динамических массивов элементов, имеющих тип «langString» (многоязычная строка, см. раздел «Поддержка многоязычности«)
dyn_dyn_shape (см. 4) Динамический массив из динамических массивов элементов, имеющих тип «shape» (указатель на графический элемент)
dyn_dyn_string (см. 4) Динамический массив из динамических массивов элементов, имеющих тип «string» (символьная строка)
dyn_dyn_time (см. 4) Динамический массив из динамических массивов элементов, имеющих тип «time» (внутренний формат времени)
dbRecordset Переменная для организации доступа с использованием интерфейса ADO (объекты данных ActiveX)
dbConnection Переменная для организации доступа с использованием интерфейса ADO (объекты данных ActiveX)
dbCommand Переменная для организации доступа с использованием интерфейса ADO (объекты данных ActiveX)
shape Указатель на графический элемент
dyn_shape Динамический массив указателей на графические элементы
idispatch Тип данных для методов объектов ActiveX

ПРИМЕЧАНИЕ

Необходимо отметить, что типы данных «dpid», «dyn_dpid», «dpidentifier» и «dyn_dpidentifier» используются только в интерфейсе прикладного программирования (API). В языке CTRL для получения информации о списке точек данных при групповом аларме следует использовать переменную с типом «dyn_string». Дополнительная информация об API представлена в разделе «API, основы«.

  1. Для адресации отдельных битов в наборе битов или отдельных символов в символьной строке может использоваться нотация: «pattern[i]» (набор_битов[i]) или «string[i]» (строка[i]). Наименьший индекс равен нулю. В наборах битов/строках отдельные биты/символы не могут быть записаны или перезаписаны побитово/посимвольно. В языке Control наборы битов следует изменять с использованием Функций для переменных bit32/bit64. ВНИМАНИЕ: Поскольку наборы битов имеют тип «bit32», «pattern[i]» (i-й элемент набора битов) имеет тип «bool», а «string[i]» (i-й элемент строки переменной типа «string») имеет тип «char».
  2. В переменных типа «time» отсчет времени ведется с 01.01.1970 г. (как в Unix-системах). Для секунд используются 32 бита.  Миллисекунды сохраняются в дополнительной переменной с типом «unsigned short» (короткое целое без знака).

В ОС Windows отсутствует возможность работы с отрицательными значениями времени, например, при выполнении расчетов. Таким образом, целое число, соответствующее секундам, должно заранее преобразовываться в тип «time».

Пример 1:

int  i = -86400;

time c = getCurrentTime();

DebugN((time)(period(c) + i));

Пример 2 (для времени с миллисекундами):

int  i = -86400;

time c = getCurrentTime();

DebugN((time)((float)c + i));

  1. Для адресации отдельных элементов динамических массивов используется нотация «array[i]» (массив[i]), при этом наименьшим индексом является единица. Динамические массивы инициализируются путем присвоения значений отдельным элементам или посредством специальных функций, предназначенных для работы с массивами. Отдельные элементы массива «dyn_int» имеют тип «int», отдельные элементы массива «dyn_unint» имеют тип «uint» и т.д.
  2. ВНИМАНИЕ: В том случае, если атрибут элемента точки данных имеет тип динамического массива (dyn_…), отдельные элементы данного массива не могут быть заданы/установлены при помощи функций «dpSet()» и «dpSetTimed()», а также не могут быть считаны при помощи функций «dpGet()», «dpGetAsynch()» или «dpGetPeriod()». Также к отдельным элементам динамического массива не может применяться функция «dpConnect()». Исходные и текущие значения должны записываться в массив только в виде полного набора элементов массива.
  3. Элементы подобного динамического массива могут иметь отличающиеся друг от друга типы данных.

    Пример:

    anytype any1, any2;
    dyn_anytype atype;

    any1 = 3.14; //Тип данных переменной any1 устанавливается как «float».
    any2 = atype; //Тип данных переменной any2 устанавливается как «dyn_anytype»
  4. Числовые значения с ведущим нулем интерпретируются как восьмеричные. Числовые значения с ведущими символами 0Х интерпретируются как шестнадцатеричные. ВНИМАНИЕ: в примере ниже при втором объявлении переменной будет выводиться сообщение об ошибке, так как эти числа воспринимаются как восьмеричные. Без ошибок: dyn_int time = makeDynInt( (((04*60)+00)*60) ); с ошибкой: dyn_int time = makeDynInt( (((09*60)+00)*60) ); . Синтаксические ошибки также будут иметь место при использовании выражений iHour=09; и iMinute=08; .
  5. В отличие от переменной с типом «anytype», переменная с типом «mixed» изменяет свой тип при каждом присваивании значения, см. пример ниже:

examp_func()
{
anytype a;
mixed   m;
a  = false;
m = false;
DebugN(a); //Возвращает 0 или FALSE
DebugN(m); //Возвращает 0 или FALSE
a = «example»;
m = «example»;
DebugN(a); //Возвращает 1 or TRUE
DebugN(m); //Возвращает «example»
}

  1. Переменные типа «mapping» (ассоциативные массивы) используются для хранения произвольных пар ключ-значение. Ключи и значения сохраняются в двух массивах (один для ключей и один для значений). Mapping для пары ключ:значение «one»: 1, «two»: 2, «three»: 3 выглядит следующим образом:

ключ        значение

«one»        1

«two»        2

«three»      3

Дополнительная информация приведена в разделе «Ассоциативные массивы«.

  1. Большие двоичные объекты (blob) используются в системе «КАСКАД Цифра» для передачи данных между драйвером и пользовательским интерфейсом прикладного программирования.

Преобразование десятичных чисел в числа с плавающей точкой

Стандарт IEEE 754 нормирует формат представления чисел с плавающей точкой. Кроме того, стандарт нормирует методы выполнения математических операций, таких как, например, округление. Для чисел с плавающей точкой существуют два возможных формата: 32 бита (одинарная точность) и 64 бита (двойная точность).

Также как и в языке C++, в языке CTRL системы «КАСКАД Цифра» доступны типы данных «float» и «double». Внутри системы оба этих типа сопоставляются типу «float», при этом значения сохраняется как «double». Таким образом, для чисел с плавающей точкой обеспечивается двойная точность.

Арифметические операции с числами с плавающей точкой сложнее, чем операции с двоичными значениями.

Десятичное число не может быть точно отображено в виде числа с плавающей точкой стандарта IEEE745 (из-за точности округления), вне зависимости от того, используется ли одинарная или двойная точность. В данном разделе не приводится детальное описание процесса преобразования десятичного числа в число с плавающей точкой, поскольку речь идет о базовой операции в области информатики.

При работе с периферийными устройствами, которые поддерживают работу только с числами с плавающей точкой обычной точности, или при настройке диапазонов алармов для десятичных значений, до начала промышленного применения следует оценить влияние ограничений стандарта IEEE 754 при преобразовании типов данных.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *