BITADR тоже для не стоит применять. В КДС откройте справка - содержание, в поиске наберите BITADR. Само описание функции и прочтите про ошибку №4031
С помощью неё ни чего присваивать не получиться, да и само смещение надо дополнительно разбирать
ЗЫ оскат это сообщество программистов пишущих открытый исходный код, так что одного человека нечего благодарить
Последний раз редактировалось capzap; 03.09.2012 в 21:20.
спасибо.
если переписывать в память обмена модбас не единый массив, а например две независимые структуры, предполагаю , что между структурами может быть "щель" из адресного пространства, используемого для других целей.
компилятор и редактор связей не обязаны размещать отдельные переменные вплотную.
да и собственно структуру не обязан размещать единым блоком?
Это удобно в каждом канале начинать заполнение с начала области сетевого обмена. Такая конфигурация ? (скриншот)
И мастер будет воспринимать их как 2 разных slave устройства на одной линии?
А внутри структуры отсутствие щелей между компонентами (исключая выравнивание, если оно там есть) гарантировано?
Егор про тип указателя правильно сказал :
v : тип
pv : pointer to тип
v:=pv^;
pv^:=v;
И syslibmem не нужен, и скорость таже (в отдельных случаях даже быстрее)
К сожалению - есть. И struct ровняется под кварту в отличие от ФБ. И sizeof офлайн/онлайн - из-за этого могут отличаться. Но лично я тоже предпочитаю явное указание пустышек.Внутри структуры нет щелей
Ну тут бы я поспорил Лажает только при косяках пользователя. Но незачем ее неподелу трогать. И, по чесноку, у syslibmem есть (или была ) махонькая ошибка при юзании кучи. И еще бывают траблы c P : pointer to dword/real не выровненым под кварту.не увлекайтесь SysLibMem, при частом её использовании, ПЛК "лажает"
Причем лучше сразу попасть в недоступную память - чтоб сразу перезагрузка и разобраться. CheckPointer на стадии отладки может помочь.при ошибке в работе с указателями
Кстати по Bitaddr можно добраться до бита - там типа сегментов в ПК. Но нужен сегмент. А битадр - это смещение этого бита в сегменте. А вот с сегментами разбираться нет желания. Причем в каждом ПОУ разные сегменты судя по всему, у i/o конфигурации тоже.
битадр даете указатель очень похожий на указатели в симатике, если прочитать еще можно по быстрому, то записать куда сложнее, чем городить целое поу, лучше пойти другими методами, вроде маски и т.д.
по поводу SysLibMem, я вроде на веб-сервере попался, когда клеил строчки, при частом использовании результат был не тот, что записывал, экспериментировать долго не стал, перешел на CONCAT и поблема исчезла
по поводу структур, в общем случае щелей нет, но если вставлять були между другими типами, то конечно будут и много чего можно еще придумать, чтоб появилась не стыковка
Склейка строчек специфична. Может где случайно SIZEOF вставили вместо LEN[+1]. Или нолик забыли поставить или наоборот лишний в строку в центре воткнули. Или забыли что просто string - это 81 байт.
STRUCT T
W : WORD;
RR : REAL;
END_STRUCT
Проверьте в онлайне
p : pointer to real;
v : T;
p := adr( T.W ) + sizeof(t.w); (*казалось бы правильно чтоб добраться до T.RR*)