Вы это серьезно, так сразу бы шли с таким предложением в сименс, они там годами бились как создать систему резервирования, а тут на тебе маленькая доработка в виде платы по копеечной цене. Они сразу могут процентов 30 скинуть за свои системы, а Вам премию в виде мерседеса
Могу дать контакты ихних инженеров
Урвать кусочек рынка у множества производителей стандартного изделия по имени "Off-delay timer" (всех, начиная от Омрона, Сименса, Шнайдера, кончая миллиардом китайцев) вы с помощью этой разработки явно не сможете. Составить конкуренцию производителям сертифицированных "реле безопасности" (Pilz PNOZ, Schneider Preventa и т.п.) - тем более не удастся. В чем тогда ее смысл?
Нет. В любом случае DWORD. То есть я SysMemCpy(X, X, 4) заменяю на доступ через POINTER TO DWORD и контроллер перезагружается. Причём как-то не целиком: до нажатия кнопки RESET или отключения питания невозможно подключиться кодесисом. Забавно то, что число под указателем в панели с текущими значениями переменных при этом правильное, но скопировать его в DWORD невозможно.pointer to word/dword ? (не рулит выравнивание)
Право же Yegor ))) Именно выравнивание.
SysMemCpy(X, X, 4);
X mod 4 = 0 ? (не X^) Если нет, то ни о какой замене на pointer to dword и речи быть не может.
X откуда взят ?
Не совсем понял, но заранее не верю в "невозможно"число под указателем в панели с текущими значениями переменных при этом правильное, но скопировать его в DWORD невозможно.
Последний раз редактировалось Валенок; 12.11.2012 в 18:45.
X из массива байтов. Версия с выравниванием противоречит тому, что в онлайне под указателем отладчик кодесиса показывает правильное значение. Я пока дома сижу и реальный код показать не могу; ситуация на поверхности примерно такая:Право же Yegor ))) Именно выравнивание.
SysMemCpy(X, X, 4);
X mod 4 = 0 ? (не X^) Если нет, то ни о какой замене на pointer to dword и речи быть не может.
X откуда взят ?
То есть я буквально заменяю строку с SysMemCpy строкой с разыменованием указателя, и контроллер говорит «пиии», и всё. Как окажусь на работе, постараюсь сделать проект, где баг проявляет себя.Код:PROGRAM PLC_PRG VAR buf: ARRAY [0..31] OF BYTE; ptr: POINTER TO DWORD; val: DWORD; crash: BOOL; END_VAR ptr := ADR(buf); IF NOT crash THEN SysMemCpy(ADR(val), ADR(buf), 4); (* Способ 1, всё ок — в val попадает нужное значение *) ELSE val := ptr^; (* Способ 2, облом — контроллер перезагружается *) END_IF
Последний раз редактировалось Yegor; 13.11.2012 в 13:36.
buf: ARRAY [0..31] OF BYTE;
ptr: POINTER TO DWORD;
val: DWORD;
ok,crash: BOOL;
ptr := ADR(buf);
ok := (ptr mod 4) = 0; (*?*)
Случайно не буффер ли от RTU ?
Последний раз редактировалось Валенок; 13.11.2012 в 13:51.
buf: ARRAY [0..31] OF BYTE; это видимо у Вас количество бит поставте например такую строчку: ptr := ADR(buf[0]) , что будет?