Вы наступили на грабли выравнивания.
Во-во, ещё бы эти грабли были подробнее описаны в мануале (опять я за старое, да )
Побайтовое копирование - единственный выход.
А вариант с SysMemCpy хуже? Может тут тоже есть что-то, о чём ещё предстоит узнать?
На счёт структуры - надо подумать.
По ошибке невыровненного доступа к памяти восстановление невозможно, поэтому единственным выходом является перезагрузка.
А разве я говорил о восстановлении? По моему скромному мнению, в случае фатальной ошибки контроллер должен:
1. Остановить выполнение программы.
2. Перевести выходы в безопасные состояния.
3. Записать максимум информации об ошибке в энергонезависимую память.
4. Сохранить возможность коммуникаций со средой программирования.
5. Ни в коем случае не пытаться самостоятельно стартовать снова (и сделать это только по нажатию кнопки "Сброс").
6. Стоять и ждать программиста.

Было бы хорошо, если бы Вы добавили контроллеру операцию автоматической записи информации об ошибке (при её возникновении) в энергонезависимую память (минимально - тип ошибки и программый блок, где она произошла (в идеале - номер строки)). И возможность считать эту инфу через PLC-Browser, добавив соответствующую команду (типа GetLastError). Естественно, эта информация не должна теряться при перезагрузке.