Во всяком случае, по 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.