К сожалению проза жизни. Программа не может быть операндом. А фб - это все-таки программа, хоть и с неявной передачей указателя на текущую структуру. Лобби от функций проплатили этот запрет.:)
Иначе кому они нужны были б.
Вид для печати
Во всяком случае, по GetPar Михалыч не дал по шее.
Видать, для зачета нужно еще и SetPar показать...
Я как понимаю на сегодняшний день. Указатели сами по себе есть 32-битные переменные (ну, для ПЛК100 так, во всяком случае). В зависимости от объявления указателя, контроллер вытаскивает данные строго указанной длины -
При этом способ размещения данных в получаемом значении как-то зафиксирован: по указанном уадресу - младший байт, а затем по возрастающей.Код:1 бит для BOOL
1 байт для BYTE, SINT, USINT
1 слово для WORD, INT, UINT
2 слова для DWORD, DINT, DUINT
строка для STRING (окончание по нулю?)
иное, если пользовательский тип данных
Аналогично следует размещать данные при записи. Потанцевав, ясен перец, с неразрушением данных в чужих полях (ибо наш универсальный пойнтер указывает на 4-байтный простор, который нужно засеять).
Хочу еще попробовать просто присваивать пойнтеры разных типов. Если получится, то танцев будет меньше.
З.Ы. Удивлен экспериментом с битовой переменной. Если пойнтер направить на некое битовое поле, в котором записать "1" не в младший разряд, то по GetPar выдернется, естественно, целый байт. А вот явное преобразование DWORD_TO_BOOL отсекает безжалостно все, кроме младшего бита
Я-то думал, всякое ненулевое значение целого байта по указанному адресу считается TRUE. А вот нет... Берем на заметку.
почти не чего не понял,но как приятно послушать -это как хорошая песня на иностранном языке:)
Каюсь, многословен... Тут ведь идет мучительный процесс научения меня, сухой остаток стараюсь выкладывать время от времени, но он все равно получается мокрый. Ну, думаю, что пример (скоро уже с SetPar) покажет все понятое.
БайтЦитата:
1 бит для BOOL..
Может где и есть железки адресующие непосредственно бит, но я не слыхал.Цитата:
Если пойнтер направить на некое битовое поле, в котором записать "1" не в младший разряд, то по GetPar выдернется, естественно, целый байт.
Не отсекает, а сравнивает с нулем весь DWORD. Улавливаете ?Цитата:
А вот явное преобразование DWORD_TO_BOOL отсекает безжалостно все, кроме младшего бита
Не путайте прынципиально разные штуки 1 и2:
1. Вызов экземпляра с одновременным присваиванием данных:
или просто вызов (со старыми данными)Код:GetPar(by1:=5);
2. Чтение/запись переменных экземпляра,Код:GetPar();
без вызова его кода:
Это при вызове функции нужно дать все, а ФБ что надо, выборочно. Поэтому приходится писать имена переменных, чтобы компилятор понял чего ему дают.Код:dw := GetPar.X;
Drvlas наверное имел ввиду что на нижнем уровне что ф.б., что прог,что функ. :
..
CALL ...
...
И что для ф.б. не сделали из
X := FB(A := ?).X
релиз типа :
..
mov FB.A, ? ______________________;A := ?
push @FB _______________________;FB()
call привязаная_к_FB_прога
mov X, FB.X ______________________;X := FB.Х
А было б неплохо, а ?
PS
Замучил этот автосборщик пробелов
ага! теперь ясно. что ж, логика фб вообще как-то до меня сложно доходит.
перечел ваш классический труд, п.п. 5.3.2 и 5.3.3. то, что я понял сейчас, никак не противоречит изложенному там, конечно. но там неочевидна разница - обратиться к переменным экземпляра до вызова или после вызова.
спасибо!
Готовлю я себе примерчик, отрабатываю даже то, что сейчас не нужно... И наткнулся на такую ругню компилятора:
На первое присвоение пишет:Код:toda: TOD;
dat: DATE;
...
toda := toda + TOD#00:01;
dat := dat + DATE#0000-00-01;
А на второе:Код:Несоответствие операнда 2 в "+": невозможно преодразовать TOD в TOD
Вопрос: как прибавить к дате 1 день? Ко времени суток 1 минуту?Код:Неверный формат даты
Несоответствие операнда 2 в "+": невозможно преодразовать DATE в DATE
ИСПРАВЛЕНО: Ко времени дня добавить можно
А вот к дате... Даже 24 часа не помогают - дает из 2010-12-03 2013-08-29...Код:toda := toda + T#1m;
Определил, что
Компилируется нормально и дает 2 января 1970 года. А вот прибавить так 1 день НИЗЗЯ:Код:dat := TIME_TO_DATE(T#1d);
Так что вопрос открытыйКод:dat := dat + TIME_TO_DATE(T#1d);