https://help.codesys.com/webapp/_cds...rsion=3.5.17.0
https://help.codesys.com/webapp/fb_f...rsion=3.5.17.0
Вид для печати
В целом разобрался, нужно потестировать но ПЛК пока далеко. Пытаюсь на эмуляторе прогнать, однако при вызове FB FILE.GetSize сразу вываливается ошибка ASM_CREATEJOB_FAILED 5113 Job creation of AsyncManager failed
Эмулятор не поддерживает работу с файлами?
Вы уж не сердитесь. Просто много вопросов возникает по ходу "пЪессы". Платформа пока новая, в процессе изучения
Эмулятор действительно не поддерживает работу с файлами.
Используйте виртуальный контроллер:
http://www.owen.ru/forum/showthread....l=1#post296706
А что мне даст входной параметр eStructData если у меня будет только один входной параметр pStructData? Тогда может имеет смысл сделать несколько входных параметров pstStructDataA, pstStructDataB, pstStructDataC и в зависимости от типа eStructData в FB обрабатывать соответствующую входную переменную? Но тогда нужно тщательно контролировать соответствие eStructData типу структуры входного параметра иначе меня будут ждать непредсказуемые "чудеса"
И еще вопрос по ходу: Тут по поводу указателей на экземпляры у меня вопрос - ведь процессор на самом деле 32 разрядный, а это значит что выборка по шине данных происходит, грубо говоря по 4 байта за один цикл чтения по шине данных. Соответственно если структура данных занимает неполных 32 бита, должно происходить выравнивание. Не произойдет ли "искажение" сохраняемых/получаемых данных если использовать POINTER TO BYTE а сами данные будут INT или того хуже FLOAT, или вообще какие-нибудь сложные структуры?
С помощью "одного входного параметра pStructData" можно передать в блок любые данные любых типов.Цитата:
А что мне даст входной параметр eStructData если у меня будет только один входной параметр pStructData?
Это справедливое высказывание. Программирование - оно вообще во многом именно про "тщательно контролировать".Цитата:
Но тогда нужно тщательно контролировать соответствие eStructData типу структуры входного параметра иначе меня будут ждать непредсказуемые "чудеса"]]
Выравнивание памяти в структурах есть.Цитата:
И еще вопрос по ходу: Тут по поводу указателей на экземпляры у меня вопрос - ведь процессор на самом деле 32 разрядный, а это значит что выборка по шине данных происходит, грубо говоря по 4 байта за один цикл чтения по шине данных. Соответственно если структура данных занимает неполных 32 бита, должно происходить выравнивание. Не произойдет ли "искажение" сохраняемых/получаемых данных если использовать POINTER TO BYTE а сами данные будут INT или того хуже FLOAT, или вообще какие-нибудь сложные структуры?
Пользователь должен учитывать его при обработке структур.
См. также:
https://help.codesys.com/webapp/_cds...rsion=3.5.17.0
Спрошу иначе. Какой тип pStructData будет объявлен в FB?Цитата:
С помощью "одного входного параметра pStructData" можно передать в блок любые данные любых типов.
Я сделал так:
А в коде FB я обрабатываю так (кусок логики):Код:FUNCTION_BLOCK SaveDataToFile
VAR_INPUT
sFileName : STRING;
pstDataMC : POINTER TO MACHINE_CONFIG;
pstDataRCP : POINTER TO RECIPIES;
pstDataDP : POINTER TO DRIVE_PARAMS;
szData : UINT;
eNameData : STRUCT_NAME;
END_VAR
МОжет можно проще, но я не понял какКод:FILE_WORK.WRITE:
CASE eNameData OF
STRUCT_NAME.MACHINE_CONFIG:
fbFileWrite(xExecute:=TRUE, hFile:=hFile, pBuffer:=pstDataMC, szSize:=szData);
STRUCT_NAME.DRIVE_PARAMS:
fbFileWrite(xExecute:=TRUE, hFile:=hFile, pBuffer:=pstDataDP, szSize:=szData);
STRUCT_NAME.RECIPIES:
fbFileWrite(xExecute:=TRUE, hFile:=hFile, pBuffer:=pstDataRCP, szSize:=szData);
END_CASE
IF fbFileWrite.xDone THEN
fbFileWrite(xExecute:=FALSE);
CASE eNameData OF
STRUCT_NAME.MACHINE_CONFIG:
wCRC16_std := MEM.CRC16_standard(pMemoryBlock := pstDataMC, uiLength := szData);
STRUCT_NAME.DRIVE_PARAMS:
wCRC16_std := MEM.CRC16_standard(pMemoryBlock := pstDataDP, uiLength := szData);
STRUCT_NAME.RECIPIES:
wCRC16_std := MEM.CRC16_standard(pMemoryBlock := pstDataRCP, uiLength := szData);
END_CASE
enState := FILE_WORK.WRITE_CRC;
END_IF
IF fbFileWrite.xError THEN
CASE enFileErr OF
; //Обработчик ошибок
END_CASE
END_IF
POINTER TO BYTE, например.Цитата:
Спрошу иначе. Какой тип pStructData будет объявлен в FB?
Если для блока содержание структуры не имеет значения (например, нет необходимости ее парсить) - то eNameData вообще не нужен.
В CODESYS указатели фактически хранятся как переменные типа DWORD (для 32-битных платформ) или LWORD (для 64-битных платформ).
POINTER TO <TYPE> - это синтаксический сахар над этим DWORD/LWORD, который позволяет компилятору проверять соответствие типов при разыменовании и обеспечивать индексный доступ.
CAA.PVOID - это просто псевдоним (ALIAS) для типа __XWORD. Это платформо-зависимый тип, который на 32-битных платформах превращается в DWORD, а на 64-битных - в LWORD.
Поэтому принципиальной разницы между описанными вами вариантами для описанной вами ситуации я вообще не вижу.
ТАк правильно объявлять переменную с таким типом правильно как ?
POINTER TO CAA.PVOID
или просто
CAA.PVOID т.к. это уже указатель?