И все это должен сделать девайс о котором здесь идет речь.
Вид для печати
Вы это серьезно, так сразу бы шли с таким предложением в сименс, они там годами бились как создать систему резервирования, а тут на тебе маленькая доработка в виде платы по копеечной цене. Они сразу могут процентов 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 невозможно.
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
buf: ARRAY [0..31] OF BYTE;
ptr: POINTER TO DWORD;
val: DWORD;
ok,crash: BOOL;
ptr := ADR(buf);
ok := (ptr mod 4) = 0; (*?*)
Случайно не буффер ли от RTU ?
buf: ARRAY [0..31] OF BYTE; это видимо у Вас количество бит :) поставте например такую строчку: ptr := ADR(buf[0]) , что будет?