Во всяком случае, по 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 отсекает безжалостно все, кроме младшего бита
Последний раз редактировалось Валенок; 04.12.2010 в 12:09.
Не путайте прынципиально разные штуки 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
Замучил этот автосборщик пробелов
Последний раз редактировалось Валенок; 04.12.2010 в 12:54.
ага! теперь ясно. что ж, логика фб вообще как-то до меня сложно доходит.
перечел ваш классический труд, п.п. 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);
Последний раз редактировалось drvlas; 04.12.2010 в 14:33.